任何人都知道在byte []数组中搜索/匹配字节模式然后返回位置的有效方法.
例如
byte[] pattern = new byte[] {12,3,5,76,8,0,6,125};
byte[] toBeSearched = new byte[] {23,36,43,76,125,56,34,234,12,3,5,76,8,0,6,125,234,56,211,122,22,4,7,89,76,64,12,3,5,76,8,0,6,125}
Run Code Online (Sandbox Code Playgroud) 我正在寻找很多短文本(haystack)中很短的子串(模式,针).但是,我不太确定在天真的暴力方法之外使用哪种方法.
背景:我正在做一个有趣的侧面项目,我收到多个用户的短信聊天记录(2000-15000行文本和2-50个用户),我想在聊天中找到所有各种模式匹配根据我提出的预定单词记录日志.到目前为止,我有大约1600种模式,我正在寻找,但我可能会寻找更多.
因此,例如,我想找到在平均文本消息日志中使用的与食物相关的单词的数量,例如"汉堡包","披萨","可乐","午餐","晚餐","餐馆","麦当劳".虽然我给出了英语示例,但实际上我将使用韩语作为我的程序.这些指定单词中的每一个都有各自的分数,我将其分别作为键和值放在哈希映射中.然后,我展示了食物相关单词的最佳得分者以及这些用户用于食物单词的最常用单词.
我目前的方法是通过空格消除每行文本,并通过使用haystack包含模式的contains方法(使用indexOf方法和朴素子串搜索算法)处理大海捞针中的每个单词.
wordFromInput.contains(wordFromPattern);
Run Code Online (Sandbox Code Playgroud)
举一个例子,聊天中有17个用户,13000行文本和1600个模式,我发现这个方法整个程序用了12-13秒.在我正在开发的Android应用程序上,处理需要2分30秒,这太慢了.
最初,我尝试使用哈希映射并仅仅获取模式而不是在ArrayList中搜索它,但我意识到这是......
我试图用子串做什么.
我查看了Stackoverflow,发现了很多有用的相关问题,比如这两个:
1和2.我对各种字符串算法(Boyer Moore,KMP等)比较熟悉
我最初认为天真的方法当然是我案例中最糟糕的算法类型,但是在发现这个问题后,我意识到我的情况(简短模式,短文本),实际上可能对天真更有效方法.但我想知道是否有一些我完全忽视的东西.
以下是我的代码片段,但是如果有人想要更具体地看到我的问题.
虽然我删除了大部分代码以简化它,但我使用实际匹配子字符串的主要方法是matchWords()方法.
我知道这是非常丑陋和糟糕的代码(5代表循环...),所以如果有任何建议,我也很高兴听到它.
所以要清理它:
我只想在思考过程中得到一些意见,可能还有一些一般的建议.但另外,如果可行,我想对特定算法或方法提出一些具体建议.
我有一个很大的字符串说"aaaaaaaaaaabbbbbbbbbcccccccccccdddddddddddd"(但可能更长),我有很多小字符串的集合.我想计算(重叠是好的)在大字符串中找到小字符串的次数.我只关心速度.KMP似乎很好,但看起来Rabin-Karp处理了多个但很慢.
有没有办法在powershell中判断指定文件是否包含指定的字节数组(在任意位置)?
\n\n就像是:
\n\nfgrep --binary-files=binary "$data" "$filepath"\nRun Code Online (Sandbox Code Playgroud)\n\n当然,我可以写一个简单的实现:
\n\nfunction posOfArrayWithinArray {\n param ([byte[]] $arrayA, [byte[]]$arrayB)\n if ($arrayB.Length -ge $arrayA.Length) {\n foreach ($pos in 0..($arrayB.Length - $arrayA.Length)) {\n if ([System.Linq.Enumerable]::SequenceEqual(\n $arrayA,\n [System.Linq.Enumerable]::Skip($arrayB, $pos).Take($arrayA.Length)\n )) {return $pos}\n }\n }\n -1\n}\n\nfunction posOfArrayWithinFile {\n param ([byte[]] $array, [string]$filepath)\n posOfArrayWithinArray $array (Get-Content $filepath -Raw -AsByteStream)\n}\n\n// They return position or -1, but simple $false/$true are also enough for me.\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\x94 但速度非常慢。
\n我正在尝试评估不同的子串搜索(ala strstr)算法和实现,并寻找一些精心设计的针和干草堆字符串,它们将捕获最坏情况的性能和可能的角落错误.我想我可以自己解决这些问题,但我认为有人必须在某个地方找到很多测试用例...
放弃
strchr 需要一个以NUL结尾的字符串我正在寻找最快的方法来识别字节缓冲区中给定字节的第一次出现.
这让人联想到在字符串中第一次出现字符,除了:
string或中分配vector,我只传下一个切片(又名,指针和长度)基本解决方案是:
size_t search(char const* buffer, size_t length, char c) {
return std::find(buffer, buffer + length, c) - buffer;
}
Run Code Online (Sandbox Code Playgroud)
然而,使用Godbolt编译器(-O2 -msse2 -mavx)的快速往返并没有显示任何矢量化指令的暗示,只有一些展开,所以我想知道这是否是最优的.
有没有更快的方法来查找缓冲区中给定字节的第一次出现?
注意:只有第一次出现很重要.
注意:我只关心Linux上的现代x86_64 CPU,但我鼓励尽可能通用的答案并清楚地提及假设.
我有大量的单词和短语(词典或词典),其中包含通配符。我需要在一个较小的字符串(目前约150个字符)中找到这些单词和短语的所有实例。
最初,我想反向运行该操作;这是要检查我的较小字符串中的每个单词是否在Lexicon中存在,可以将其实现为哈希表。问题在于我的词典中的某些值不是单个单词,而很多是通配符(例如substri *)。
我正在考虑使用Rabin-Karp算法,但是我不确定这是最佳选择。
什么是执行此操作的有效算法或方法?
样本数据:
该词典包含数百个单词,并且可能会扩展。这些词可能以通配符(星号)结尾。以下是一些随机示例:
我们正在分析的文本(此时)是简短的,非正式的(语法上的)英语陈述。文本的主要示例(同样是在此时)是Twitter Tweet。这些限制为大约140个字符。例如:
Just got the Google nexus without a contract. Hands down its the best phone
I've ever had and the only thing that could've followed my N900.
Run Code Online (Sandbox Code Playgroud)
注意我们正在对本文进行非常简单的情感分析可能会有所帮助;我们的情绪分析技术与我无关。我只是将现有解决方案迁移到“实时”处理系统,并且需要执行一些优化。
.eg 1.日志文件
当我从头开始读取文件时,我能够获得 Line1 的查找位置。
func getSeekLocation() int64 {
start := int64(0)
input, err := os.Open(logFile)
if err != nil {
fmt.Println(err)
}
if _, err := input.Seek(start, io.SeekStart); err != nil {
fmt.Println(err)
}
scanner := bufio.NewScanner(input)
pos := start
scanLines := func(data []byte, atEOF bool) (advance int, token []byte,
err error) {
advance, token, err = bufio.ScanLines(data, atEOF)
pos += int64(advance)
return
}
scanner.Split(scanLines)
for scanner.Scan() {
if strings.Contains(scanner.Text(), "Line1") {
break …Run Code Online (Sandbox Code Playgroud) 您将使用哪种算法在短文本中搜索短子串?简而言之,我的意思是子串为5-10个字符,字符串为255.我正在考虑根据输入数据长度选择算法.对于更长的输入,哪种算法更好?
我有一个包含数千行的文本文件.查找文件中是否存在某个字符串的最佳方法是什么?
通过将整个文件读入字符串然后使用string.contains方法或使用方法创建所有行的列表Files.readAllLines然后循环遍历列表中的每一行并检查该行是否包含所需的字符串?
更新:我使用的是Java 7.搜索限制为每个文件1-2个字符串搜索(10个文件).要搜索的字符串随文件而变化.如果找到字符串,我想停止搜索.
可能重复:
什么是最快的子字符串搜索算法?
如何检查字符串是否存在于C++或Java中长度为100,000个字符的较大字符串中?
我知道一种方法,str.find("sub_string");但它无法处理如此大的字符串.最长执行时间为1秒.
我需要寻找的子字符串也可以是50,000!