字符串匹配:KMP算法

转载自代码随想录 (programmercarl.com) 获得更好观看体验请去往代码随想录处

概念认知

什么是KMP

说到KMP,先说一下KMP这个名字是怎么来的,为什么叫做KMP呢。

因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP

KMP有什么用

KMP主要应用在字符串匹配上。

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

所以如何记录已经匹配的文本内容,是KMP的重点,也是next数组肩负的重任。

Read More

5-消息缓冲

错误Sequence contains no elements

请使用.FirstOrDefault()而不是.First()

否则 ==队列为空时== 会报错 Sequence contains no elements

解决线程冲突

由异步的机制可以知道,BeginSend和回调函数往往执行于不同的线程,如果多个线程同时操作writeQueue,有可能引发些问题。

在图4-36所示的流程中,玩家连续点击两次发送按钮,假如运气特别差,第二次发送时,第一次发送的回调函数刚好被调用。

如果线程1的Send刚好走到writeQueue.Enqueue(ba)这一行(t2时刻),按理说writeQueue.Count应为2,不应该进入if(writeQueue.Count==1)的真分支去发送数据(因为此时writeQueue.Count==2)。

Read More

4-物理检测

内置的碰撞检测

Unity中开启碰撞检测至少需要一方拥有RigidBody,通过OnCollisionEnter方法检测到碰撞

内置碰撞检测的不足

如果我们需要对物理检测进行更精准的定位,可以修改它的检测模式和线性检测方法。将将body的检测模式更改为连续检测模式或者动态连续检测模式。将线性改为线性模式。

1
2
3
Rigidbody rigidbody;  
rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
rigidbody.interpolation = RigidbodyInterpolation.Interpolate;

经过以上调整,我们可以发现并没有得到很好的效果,子弹仍然会在穿墙之后爆炸或者不爆炸。

使用射线检测辅助

经过研究发现仍然问题仍然出现在子弹的速度过快。因为unity的物理是在fix update中进行。

Read More