×

模式匹配

什么是半导体泵浦固体激光器中的光谱匹配和模式匹配?KMP模式匹配算法是什么

admin admin 发表于2022-05-10 05:35:30 浏览106 评论0

抢沙发发表评论

什么是半导体泵浦固体激光器中的光谱匹配和模式匹配

光谱匹配指泵浦光光谱与激光介质吸收谱吻合,比如掺钕介质吸收峰在808nm附近。模式匹配是指泵浦光斑整形后尺寸与激光谐振腔基模振荡光斑尺寸接近。

KMP模式匹配算法是什么

KMP模式匹配算法是一种改进算法,是由D.E.Knuth、J.H.Morris和v.R.Pratt提出来的,因此人们称它为“克努特-莫里斯-普拉特操作”,简称KMP算法。此算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。其改进在于:每当一趟匹配过程出现字符不相等时,主串指针i不用回溯,而是利用已经得到的“部分匹配”结果,将模式串的指针j向右“滑动”尽可能远的一段距离后,继续进行比较。

1.KMP模式匹配算法分析回顾图4-5所示的匹配过程示例,在第三趟匹配中,当i=7、j=5字符比较不等时,又从i=4、j=1重新开始比较。然而,经仔细观察发现,i=4和j=1、i=5和j=1以及i=6和j=1这三次比较都是不必进行的。因为从第三趟部分匹配的结果就可得出,主串中的第4、5和6个字符必然是b、c和a(即模式串第2、第2和第4个字符)。因为模式中的第一个字符是a,因此它无须再和这三个字符进行比较,而仅需将模式向右滑动2个字符的位置进行i=7、j=2时的字符比较即可。同理,在第一趟匹配中出现字符不等时,仅需将模式串向右移动两个字符的位置继续进行i=2、j=1时的字符比较。由此,在整个匹配过程中,i指针没有回溯,如图1所示。

图1改进算法的模式匹配过程示意

为什么诸多编程语言都将模式匹配作为重要构成

简单来说, 模式匹配提供一个方便的解构(Destructuring)数据结构的方式, 而且构造跟解构的语法是类似(甚至相同)的可以加强语言的一致性.以语法和传统的C比较相近的Rust为例struct Point { x: i32, y: i32,}let origin = Point { x: 0, y: 0 }; //^^^^^^^^构造^^^^^^^^^match origin { Point { x: x, y: y } =》 println!(“({},{})“, x, y), //^^^^^^^^解构^^^^^^^^^}via Patterns但是解构数据结构都用模式匹配也有不方便的地方, 当数据结构比较“浅“的时候, 模式匹配还是比较好用, 就像上面的例子一样, 但是当数据结构比较“深“的时候, *只有*模式匹配的语言做get/set操作就略麻烦data Person = P { name :: String , addr :: Address }data Address = A { street :: String , city :: String , postcode :: String }setPostcode :: String -》 Person -》 PersonsetPostcode pc p = p { addr = addr p { postcode = pc }}via 因为postcode这个成员藏得比较深, 想一次过set postcode, 做的解构次数会很多, 实际中肯定会存在这种情况, 想一下各种一层嵌一层的JSON. 其中一个解决方法就是用一个中间变量先把address拿出来, 再拿postcode. 这就失去了 @肖剑 在评论提到的可以减少中间变量的便利.如果能像OO用“.“来访问: person.address.postcode = newPostcode , 不是更加方便? 深入下去偏离题目讨论的内容, 关于“.“的话可以看Erik Merijer的 The essence of data access in cω: The power is in the dot. Haskell对这个问题的解决办法是lens: Lenses, Folds and Traversals这个库, 这是个简单的介绍