因此,我需要编写一种有效的算法来查找字典中缺少字母的单词,并且需要一组可能的单词。
例如,如果我有这个,我可能会找回这些主题主题等等。
我想知道是否有人可以建议我应该使用的某些数据结构或算法。
谢谢!
编辑:特里太太空间不足,并且会使其太慢。还有其他想法修改吗?
更新:最多会有两个问号,当两个问号确实出现时,它们将依次出现。
目前,我使用3个哈希表表示何时完全匹配,1个问号和2个问号。给定字典,我将所有可能的单词散列。例如,如果我有单词WORD。我对WORD,?ORD,W?RD,WO?D,WOR?,??
RD,W ?? D,WO ??进行散列。进入字典。然后,我使用链接列表将碰撞链接在一起。所以说hash(W?RD)=
hash(STR?NG)=17。hashtab(17)将指向WORD,而WORD则指向STRING,因为它是一个链表。
平均查询一个单词的时间约为2e-6s。我希望做得更好,最好在1e-9左右。
编辑:我没有再看这个问题,但是插入3m条目花了0.5秒,而查找3m条目花了4秒。
谢谢!
我相信在这种情况下,最好只使用一个平面文件,其中每个单词排成一行。使用此功能,您可以方便地使用正则表达式搜索的功能,该功能经过高度优化,可以击败您可以针对此问题设计的任何数据结构。
这是用于此问题的Ruby代码:
def query(str, data)
r = Regexp.new("^#{str.gsub("?", ".")}$")
idx = 0
begin
idx = data.index(r, idx)
if idx
yield data[idx, str.size]
idx += str.size + 1
end
end while idx
end
start_time = Time.now
query("?r?te", File.read("wordlist.txt")) do |w|
puts w
end
puts Time.now - start_time
该文件wordlist.txt
包含45425个单词(可在此处下载)。该程序的查询输出为?r?te
:
brute
crate
Crete
grate
irate
prate
write
wrote
0.013689
因此,只需花费37毫秒即可读取整个文件并在其中找到所有匹配项。即使在Trie非常慢的情况下,它也可以很好地扩展用于各种查询模式:
询问 ????????????????e
counterproductive
indistinguishable
microarchitecture
microprogrammable
0.018681
询问 ?h?a?r?c?l?
theatricals
0.013608
这对我来说足够快。
如果您想走得更快,可以将单词表拆分为包含相等长度单词的字符串,然后根据您的查询长度搜索正确的单词。用此代码替换最后5行:
def query_split(str, data)
query(str, data[str.length]) do |w|
yield w
end
end
# prepare data
data = Hash.new("")
File.read("wordlist.txt").each_line do |w|
data[w.length-1] += w
end
# use prepared data for query
start_time = Time.now
query_split("?r?te", data) do |w|
puts w
end
puts Time.now - start_time
现在,建立数据结构大约需要0.4秒,但是所有查询的速度大约要快10倍(取决于该长度的单词数):
?r?te
0.001112秒?h?a?r?c?l?
0.000852秒????????????????e
0.000169秒由于您已经更改了需求,因此可以轻松扩展您的想法,仅使用一个包含所有预先计算的结果的大哈希表。但是,您不必自己解决冲突,而可以依靠正确实现的哈希表的性能。
在这里,我创建了一个大的哈希表,其中每个可能的查询都映射到其结果列表:
def create_big_hash(data)
h = Hash.new do |h,k|
h[k] = Array.new
end
data.each_line do |l|
w = l.strip
# add all words with one ?
w.length.times do |i|
q = String.new(w)
q[i] = "?"
h[q].push w
end
# add all words with two ??
(w.length-1).times do |i|
q = String.new(w)
q[i, 2] = "??"
h[q].push w
end
end
h
end
# prepare data
t = Time.new
h = create_big_hash(File.read("wordlist.txt"))
puts "#{Time.new - t} sec preparing data\n#{h.size} entries in big hash"
# use prepared data for query
t = Time.new
h["?ood"].each do |w|
puts w
end
puts (Time.new - t)
输出为
4.960255 sec preparing data
616745 entries in big hash
food
good
hood
mood
wood
2.0e-05
查询性能为O(1),它只是在哈希表中的查找。时间2.0e-05可能低于计时器的精度。当运行1000次时,每个查询平均得到1.958e-6秒。为了更快地获取它,我将切换到C
++并使用极其节省内存且快速的Google Sparse Hash。
以上所有解决方案都可以正常工作,并且对于许多用例都应该足够好。如果您真的想变得认真并且有很多空闲时间,请阅读一些好的文章:
我正在寻找一种好的无损压缩算法,它可以非常快速地压缩/解压缩少量数据,例如0到1之间的256个浮点。我知道RLE,但也许还有更好的。 背景是我正在使用CUDA处理体积数据(例如384³浮点),而不是显式存储体积,我希望将其划分为8x4大小的块并存储压缩块。CUDA内核(每个块由8x8x4个线程组成)解压缩相应的块,对其进行处理并再次压缩。 非常感谢您的建议!
ASL 由于查找算法的主要运算是关键字的比较,所以通常把查找过程中对关键字的平均比较次数(平均查找长度)作为衡量一个查找算法效率的标准。ASL= ∑(n,i=1) Pi*Ci,其中n为元素个数,Pi是查找第i个元素的概率,一般为Pi=1/n,Ci是找到第i个元素所需比较的次数。 顺序查找 原理是让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺点是效率低下。时间复
描述无定向多图的最佳数据结构是什么(针对速度和内存进行了优化)? 一个边的列表是不合适的,因为在我的代码中,获取顶点的邻居经常发生。 邻接列表是不好的,因为我必须保留关于已访问边的信息,并且当从1到3的边被访问时(假设我遍历1的邻居,发现一条边通向3并且具有weight),我必须在3的邻居列表中找到相同的边以将其标记为已访问,这很慢。 当每个单元格都是时,我考虑过邻接矩阵,其中是表示顶点是否被访问
我在大学上Java入门课程。我的作业是写一个程序来显示一个句子中1个字母单词的数量,一个句子中2个字母单词的数量...等等。句子是用户输入的。我应该使用一个循环,但不允许使用数组。 然而,现在只是开始,我只是想找出句子第一个单词的字母数。我得到的结果要么是字母数不正确,要么是字符串索引超出范围。 例如,当我输入“这是一个句子”时,它会给我“字符串索引超出范围:4”对此的任何帮助都将不胜感激。
这是使用LUKE,我一直在LUKE中运行查询,看看发生了什么。http://www.getopt.org/luke/ 现在我想要做的是搜索一个术语ie Gloves*,它最终是(()()()) 我不明白为什么这会被翻译成这样,并在我的查询或索引中出现问题? null 需要注意的是,当我使用out和s IE glove或out通配符搜索一个术语时,一切都很好,只是两者的结合似乎破坏了查询。
我有一些语言(英语、意大利语、阿拉伯语、法语等)的多个字符串。我想看一个单词列表,而不是那种语言的字母表。 例如,对于英语: “这根绳子”- "corect字符串格式"- 例如,阿拉伯语: "在这里"- "كلمة" - 我不想一个接一个地输入所有语言的字母表。有办法做我想做的吗?
因此,我试图提出一种算法,在字符串数组中查找带有特定字符/字母的单词。 有没有一个聪明的方法,也许通过排序列表,然后以某种方式搜索? 另外,这个算法的运行时间是多少?它会被认为是O(n)还是O(n*m)?其中n是字典中的单词数,m是数组中每个单词的长度。
本文向大家介绍PHP程序查找给定数组中缺少的数字,包括了PHP程序查找给定数组中缺少的数字的使用技巧和注意事项,需要的朋友参考一下 要查找给定数组中缺失的数字,代码如下 示例 输出结果 定义了一个名为“ missing_nums”的函数,该函数检查连续数字数组中是否缺少数字。 它遍历数组并检查以查看计数和要遍历的current_num。 如果在前一个数字加1时找不到两个值,则认为该值缺失。 在函数