- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在大量文本中实现精确的文本搜索。为此,我找到了一些针对 c# 的 Boyer Moore 实现示例,但现在我无法理解它是如何工作的。
例如,如果我有字符串 this is sample text to search for 并且想要 to search for它有效,但如果我将我的搜索模式更改为搜索和文本,它仍然返回值而不是-1。为什么会这样?在我的搜索文本中没有要搜索的带模式的字符串和文本。
下面是我通过 Stackoverflow 找到的一个实现
public class BoyerMooreStringSearching
{
readonly Dictionary<char, LastIndexTable> _lastIndexTable = new Dictionary<char, LastIndexTable>();
public string PatternToSearch;
public List<int> GetStartingIndexsOfPatternInText(string textToSearchIn, string patternToSearch)
{
var list = new List<int>();
PatternToSearch = patternToSearch;
if (patternToSearch != null && !string.IsNullOrEmpty(textToSearchIn))
{
UpdateLastIndexTable(patternToSearch);
PatternToSearch = patternToSearch;
var j = patternToSearch.Length - 1;
// Main loop to iterate over whole text
while (j <= textToSearchIn.Length - 1)
{
var lastCharOfPattern = patternToSearch[patternToSearch.Length - 1];
if (textToSearchIn[j] != lastCharOfPattern)
{
// Heuristic 1
// If Last Char is not matched with the Last char in pattern and char is not present in the pattern
// Then advance pointer 'j' to the length of the pattern in textToSearch.
if (!_lastIndexTable.ContainsKey(textToSearchIn[j]))
{
j += patternToSearch.Length - 1;
}
// Heuristic 2
// Consult the lastIndex table to get the last index of current char in textToSearch
// and advance pointer 'j' to the last index in textToSearch.
if (j <= textToSearchIn.Length - 1 && _lastIndexTable.ContainsKey(textToSearchIn[j]))
{
var tempObj = _lastIndexTable[textToSearchIn[j]];
if (tempObj != null) j += tempObj.LastIndex;
}
}
int k = patternToSearch.Length - 1;
int u = j;
if (j <= textToSearchIn.Length - 1)
{
while (k >= 0)
{
// Heuristic (3a)
// If Last Char is matched with the Last char in pattern then back track in the text and pattern till
// either you got a complete match or a mismatched charecter.
// Once you got the mismatched char and mismatched char is not present in the pattern then
// advance j to the index of mismatched charecter in the pattern
if (textToSearchIn[u] == patternToSearch[k])
{
if (k == 0 && textToSearchIn[u] == patternToSearch[k])
{
list.Add(u);
j += patternToSearch.Length - 1;
}
u--;
k--;
continue;
}
if (!_lastIndexTable.ContainsKey(textToSearchIn[u]))
{
// Heuristic (3b)
// If Last Char is matched with the Last char in pattern then back track in the text till
// either you got a complete match or a mismatched charecter.
// Once you got the mismatched char and mismatched char is not present in the pattern then
// advance j to the index of mismatched charecter in the pattern plus the number to char which matched.
j += k + (j - u);
break;
}
k--;
}
}
j++;
}
}
if (!list.Any())
list.Add(-1);
return list;
}
private void UpdateLastIndexTable(string patternToSearch)
{
_lastIndexTable.Clear();
var i = patternToSearch.Length - 1;
foreach (var charToSeach in patternToSearch)
{
if (_lastIndexTable.ContainsKey(charToSeach))
{
_lastIndexTable[charToSeach].LastIndex = i;
}
else
{
_lastIndexTable.Add(charToSeach, new LastIndexTable
{
CharSearched = charToSeach,
LastIndex = i
});
}
i--;
}
}
private class LastIndexTable
{
public char CharSearched { get; set; }
public int LastIndex { get; set; }
}
}
这是它的示例用法。
var each = "this is sample text to search for";
var result = new BoyerMooreStringSearching().GetStartingIndexsOfPatternInText(each, "to search for and text");
最佳答案
当回溯(启发式 3a)时,您会一直在搜索字符串中查找字符,直到结束。您需要为此进行额外检查:
if (k == 0 && textToSearchIn[u] == patternToSearch[k])
{
if (u + patternToSearch.Length <= textToSearchIn.Length)
list.Add(u);
j += patternToSearch.Length - 1;
}
关于c# - 了解 Boyer Moor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20097536/
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我了解不良字符启发法的工作原理。当找到不匹配的字母x时,只需移动模式,以使模式中最右边的x与字符串中的x对齐。而且很容易在代码中实现。 我想我也了解后缀启发式的工作原理。当找到合适的后缀s时,请在模式
我一直在尝试了解Boyer-Moore字符串搜索算法中的移位规则,但还不了解它们。我在wikipedia上阅读过,但这太复杂了! 如果有人以简单的方式列出规则,那将有很大的帮助。 最佳答案 在Boye
我在理解 Boyer Moore 字符串搜索算法时遇到问题。 我正在关注以下文档。 Link 我无法弄清楚 delta1 和 delta2 在这里的真正含义是什么,以及他们如何应用它来查找字符串搜索算
我尝试了几个实现,但它们都有错误。 在 SO 搜索给了我 http://www-igm.univ-mlv.fr/~lecroq/string/node14.html - 看起来不错,但这个实现给了我错
我正在尝试使用 2D 数组从 boyer moore 实现错误字符规则以进行子字符串搜索,我遇到了我看到我的 arr[0][1] 与 arr[1][0] 重叠的情况这引起了问题。我试图遍历 VS 中的
我正在尝试在大量文本中实现精确的文本搜索。为此,我找到了一些针对 c# 的 Boyer Moore 实现示例,但现在我无法理解它是如何工作的。 例如,如果我有字符串 this is sample te
我会说是,因为使用了一个右表来确定您必须跳过多少字符。对此有什么想法吗? 最佳答案 Dynamic programming is when you use past knowledge to make
根据我的理解,找到多数元素的 Boyer-Moore 多数表决算法是 O(1),即它是常数,与输入的大小不成比例。那为什么要wiki link提到对数空间 {\displaystyle O(\log
关于此算法中的两个转换规则(坏字符和好后缀),我有些不明白。他们是否一起工作,以及究竟是什么决定了在每种情况下或轮类中部署哪一个。 This综合解释以 SSIMPLE EXAMPLE 的示例结束,这让
在Boyer-Moore string search algorithm wiki 链接,据说 Boyer-Moore 的最坏情况复杂度是 O(m+n) 如果模式没有出现在文本中 O(mn) 如果模式
我不是专业程序员,所以请多多包涵。我正在四处寻找为什么 haystack 和 needle 的初始“对齐”不应该在 needle 的最后一个字符与 haystack 中的相同字符的第一次一致时进行,但
我正在研究 Boyer-Moore 算法(来自 here),我有一个快速的问题 - 第二遍的需要是什么(它基本上只是通过找到该元素的频率来“确认”)。第一个传递本身不是保证找到的元素是多数元素吗?我考
我即将实现 Boyer-Moore 模式匹配算法的变体(具体来说是星期日算法),我问自己:我的字母表大小是多少? 这取决于编码(= 可能的字符数)还是我可以假设我的字母表包含 256 个符号(= 可以
我在项目中大量使用字符串,因此我正在寻找一个快速的库来处理它们。我认为 Boyer-Moore 算法是最好的。 有免费的解决方案吗? 最佳答案 您可以考虑实现 Boyer–Moore 算法的以下资源:
我目前正在试验一个非常简单的 Boyer-Moore 变体。 总的来说,我的实现是有效的,但如果我尝试在循环中使用它,包含干草堆的字符指针就会变得困惑。我的意思是其中的字符被更改或混合。 结果是一致的
我想获得 Boyer-Moore-Horspool 实现来搜索文本文件中的某些字符串。这是我的代码: #include #include #include int bmhSearch(char
我正在用 python 实现 boyer moore 算法,我需要计算一个子串在一个字符串中出现了多少次。 我的字符串存储在一个向量中: string = ['A', 'B', 'B', 'C', '
我一直在研究 Boyer-Moore sting 搜索算法,并从 Shriphani Palakodety 的基本代码集开始,我创建了 2 个附加版本(v2 和 v3)——每个版本都进行了一些修改,例
我是一名优秀的程序员,十分优秀!