algorithm - 网络流中跨 block 的字符串匹配

标签 algorithm replace network-programming buffer string-matching

我必须处理这样一种情况,即需要搜索来自服务器的传入数据以查找字符串,然后用另一个字符串替换(尽可能不缓冲数据。)

传入的数据可以在多个 block 中。因此,给定的字符串有可能被拆分成多个 block 。例如,如果字符串是“abc”,则 block 可以是 block 1:“aaab”和 block 2:“cbbb”。然后在第一个 block 中匹配 'a' 之后,我们将不得不等待下一个 block 中是否有 'b' 的匹配项。这意味着现在我们必须开始缓冲第一个 block 。或者,至少,需要缓冲第一个 block 中匹配的字母,直到我们可以确定第二个 block 是否包含字符串的其余部分。

如果不是,那么我们将不得不返回到第一个 block 并从字母 b 重新开始匹配。

鉴于应用程序的限制,需要尽可能避免缓冲。 有没有办法以最少的缓冲来实现这一目标?对我来说,这似乎是一个足够普遍的问题,在多种情况下都会遇到,但不幸的是,我在搜索后未能找到任何解决方案或方向。

最佳答案

如果我理解正确,要搜索的模式可以完全在一个 block 中,也可以跨越两个或多个 block ,具体取决于模式和 block 大小。如果模式在两个 block 中,那么我们需要跟踪在第一个 block 中找到的所有模式前缀(作为后缀),然后在第二个 block 中搜索相应的模式后缀(作为前缀)。 这里可能需要在每个 block 上进行多模式搜索,并且可以在此处使用后缀树。 当我们收到一个新夹头时,我们已经知道要在上面搜索的所有图案。我们可以创建该 block 的后缀树,进行所有搜索,根据需要进行处理,然后移动到下一个 block ,并对其执行相同的操作。

关于algorithm - 网络流中跨 block 的字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27776103/

相关文章:

algorithm - 如何从 LSD 线检测器生成的此类数据中获取相机位置?

linux - 用文件名 linux 的一部分替换文件中的列

regex - 我可以通过哪些方式改进这个正则表达式?

sql - Postgresql 替换函数

c++ - 如何防止 WSASend() 阻塞我的 UI 线程?

ios - 使用 'Shuffle Albums' 将 NSMutableArray 随机播放到下一个队列(MediaPlayer)?

c++ - 在 C++ 中生成 N 选择 K 排列

c++ - TCP 中的垃圾值和缓冲区差异

algorithm - 生成每个 k 位数字的算法是什么?

c - 在循环中接收 UDP 数据包会使 linux 内核崩溃