查看另一个字符串中是否包含大量字符串的更快方法

2023-12-28

我有一个存储在数组中的大约 300k 常用单词的列表。因此,数组的 1 个元素 = 1 个单词。

另一方面,我有一个巨大的字符串列表,其中可能包含这 300k 个单词中的一个或多个。示例字符串为:ifdxawesome453.

现在,我需要根据常用单词检查每个长字符串。如果在该字符串中找到单词,则立即返回。所以,我需要再次检查一下这300k字ifdxawesome453并查看其中是否包含其中的任何一个。

所以我要做的是:

huge_list_of_words.any? do |word|
  random_long_word.include?(word)
end

虽然这对于随机长单词的小样本来说是可以的,但如果我有数百万个单词,突然需要几个小时才能完成这项工作。

有没有办法更快地做到这一点?我想到的唯一方法是,如果我抽样,从这 300k 中说出 10k 最常见的单词,然后首先与它进行比较,如果没有找到匹配项,则与完整列表进行比较。

另一种大幅加快速度的方法是按大小对 300k 单词的数组进行分组。然后,当我将长随机单词与它进行比较时,我首先检查单词的大小并过滤掉任何较长的单词。然后,我留下相同大小或更少单词的索引,并从大小最小的单词开始搜索它们。


Solution

Trie https://en.wikipedia.org/wiki/Trie结构是朝着正确方向迈出的一步。SuffixTree https://en.wikipedia.org/wiki/Suffix_tree也可能有帮助。

看起来像Triez gem https://github.com/luikore/triez具有比Trie gem https://github.com/tyler/trie,但文档还远未完成。:substring听起来很完美,但似乎你只能用它change_all :

# gem install triez
require 'triez'

huge_list_of_words = Triez.new value_type: :object, default: nil

%w(awesome someword anotherword).each do |word|
  huge_list_of_words[word] = word
end

class String
  def contains_word_from_dict?(dict)
    dict.change_all(:substring, self) do |v|
      return v if v
    end
    nil
  end
end

'ifdxawesome45someword3'.contains_word_from_dict?(huge_list_of_words)
# => "awesome"
'ifdxawsome45someword3'.contains_word_from_dict?(huge_list_of_words)
# => "someword"
'ifdxawsome45sameword3'.contains_word_from_dict?(huge_list_of_words)
# => nil

Test

我尝试使用更大的字典(~100k 单词)和一百万次查找:

huge_list_of_words = Triez.new value_type: :object, default: nil

dict = '/usr/share/dict/american-english'
File.foreach(dict) do |word|
  word.chomp!
  huge_list_of_words[word] = word if word.size > 4 # avoid finding `if` or `word`
end

1_000_000.times do
  'ifdxawesome45someword3'.contains_word_from_dict?(huge_list_of_words)
end

在我的速度较慢的笔记本电脑上,它在 22 秒后返回。

说实话,我不明白如何change_all有效,以及它的目的是什么。不过,它似乎确实可以很好地满足您的目的! ˙\_(ツ)_/˙

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查看另一个字符串中是否包含大量字符串的更快方法 的相关文章

  • Bundler 找不到 gem“rack”的兼容版本:

    我是 Ruby 新手 但实际上如果我不想安装 Redmine 我就不需要它 我正在按照以下说明进行操作http www redmine org projects redmine wiki HowTo install Redmine on C
  • JavaScript 预分配数组未捕获 RangeError:数组长度无效

    我有一个小循环的代码 它抛出 Uncaught RangeError Invalid Array Length 我能够在 Google Chrome 控制台中重现它 const COUNT 100 000 000 const xValues
  • 是否仍然可以在 Rails 4 中使用测试单元?

    从 Rails 3 2 升级到 Rails 4 后 我的应用程序可以运行 但我用测试单元编写的测试是一场灾难 据传 Minitest 与测试单元 兼容 然而 如果我尝试使用 现在捆绑的 Minitest 就会发现有很多差异 从断言 语句名称
  • Ruby:如何将多个方法调用与“发送”链接在一起

    必须有一种内置的方法来做到这一点 对吧 class Object def send chain arr o self arr each a o o send a return o end end 我刚刚遇到了这个 它确实需要注入 def s
  • 根据 Google Apps 脚本中的另一个数组过滤数组

    我对 JavaScript 相当陌生 可能需要一些帮助来解决我在处理 Google Apps 脚本时遇到的问题 我打算做的是根据数组过滤数据 该数组是从特定工作表中的特定单元格中获取的 其中包含我不想保留在数据中的字符串元素 换句话说 包含
  • 获取类别和子类别的所有产品(rails、awesome_nested_set)

    正在开发一个电子商务应用程序 我试图解决以下问题 我通过 Awesome nested set 插件实现了我的类别 如果我通过选择一个类别列出我的文章 一切正常 但对于某些链接 我想显示一个类别的所有产品及其子类别的产品 这是仅适用于一种类
  • 如何在二维数组中找到字符串?

    我有一个看起来像这样的数组 var array a b c d e f 我希望能够在数组中搜索字符串 d 并返回对应的值 c try function find str array for var i in array if array i
  • 找到最长的连续数字序列

    问题 H 最长自然后继者 如果自然数序列中第二个整数是第一个整数的后继 1 和 2 是自然后继 则两个连续整数是自然后继 编写一个程序 读取一个数字 N 后跟 N 个整数 然后打印连续自然后继的最长序列的长度 Example 输入 7 2
  • Ruby 中的图像抓取

    如何使用 Nokogiri 抓取特定 URL 上存在的图像 如果有比 Nokogiri 更好的选择 请提出建议 css图像标签是 profilePic img 如果它只是一个 img 带有网址 PAGE http site com page
  • 如何在原生 Swift 中实现以前称为 NSMutableOrderedSet 的可变有序集泛型类型?

    我正在尝试实现一个通用的可变有序集类型 它需要符合许多协议才能以与 Swift 中的数组和集合相同的方式运行 首先要实现泛型类型元素需要符合Hashable https developer apple com documentation s
  • 如何将具有对象数据类型的 Numpy 2D 数组转换为常规的浮点数 2D 数组

    作为我正在开发的更广泛程序的一部分 我最终得到了包含字符串 3D 坐标等的对象数组 所有这些都混合在一起 我知道与结构化数组相比 对象数组可能不是很受欢迎 但我希望在不更改大量代码的情况下解决这个问题 假设我的数组 obj array 有
  • 将对象字面量转换为排序数组

    我有一个对象文字 其中它的键的值是多个对象 并且内部对象的键之一被命名为 rank 并且具有浮点值 我想将对象文字转换为内部对象的数组 按 rank 的值排序 输入对象 452 bla 123 dff 233 rank 2 234 bla
  • 将 SQL 中的数据存储在数组中

    我正在尝试将 sql 数据库中的数据存储到数组中 目前我有这个 query mysql query SELECT FROM InspEmail WHERE Company LIKE company while row mysql fetch
  • C++ 指针数组

    Code include stdafx h include
  • mongoose 查询:通过 id 在数组中查找对象

    我怎样才能在此 Schema 中通过 id 找到图像 我有用户的 id 和我正在寻找的图像的 id 执行此操作的最佳方法是什么 在这种情况下 所有图像是否具有不同的 id 或者它们是否可以具有相同的 id 因为它们不属于同一用户 我的架构如
  • 哈米尔评论结束

    我是哈米尔新手 这让我很困惑 我不喜欢删除可以注释掉的代码 但我不知道如何在 haml 中正确结束注释 这是一个代码片段 field f label member id br f text field member id field f l
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • php,in_array,0值

    我试图理解in array下一个场景的行为 arr array 2 gt Bye 52 77 3 gt Hey var dump in array 0 arr 返回值in array 是布尔值true 正如你所看到的no值等于0 所以有人可
  • 如何使用 Rspec 来测试使用 Paperclip 的模型是否正在验证上传文件的大小?

    该模型 class Attachment lt ActiveRecord Base belongs to narrative attr accessible description user id narrative id has atta
  • 使用 Scala 在 Apache Spark 中拆分字符串

    我有一个数据集 其中包含以下格式的行 制表符分隔 Title lt t gt Text 现在对于每个单词Text 我想创建一个 Word Title 一对 例如 ABC Hello World gives me Hello ABC Worl

随机推荐