Questions tagged «string-metrics»

2
用于构建快速拼写检查器的高效数据结构
我正在尝试编写一个拼写检查器,该检查器应与相当大的词典一起使用。我真的想要一种有效的方法来索引我的字典数据,该数据将使用Damerau-Levenshtein距离来确定哪些单词最接近拼写错误的单词。 我正在寻找一种数据结构,该结构将在空间复杂度和运行时复杂度之间取得最佳折衷。 根据我在互联网上发现的信息,我对使用哪种类型的数据结构有一些建议: 特里 这是我的第一个想法,看起来很容易实现,应该提供快速的查找/插入。使用Damerau-Levenshtein进行的近似搜索在此处也应易于实现。但是就空间复杂度而言,它看起来不是很有效,因为指针存储很可能会带来很多开销。 帕特里夏·特里(Patricia Trie) 这似乎比常规的Trie占用更少的空间,因为您基本上避免了存储指针的成本,但是对于像我一样的非常大的字典,我有点担心数据碎片。 后缀树 我不确定这一点,似乎有些人确实发现它在文本挖掘中很有用,但是我真的不确定它对于拼写检查器的性能会有什么帮助。 三元搜索树 这些看起来不错,并且在复杂性方面应该与Patricia Tries接近(更好?),但是我不确定碎片是否比Patricia Tries更好。 爆裂树 这似乎是一种混合,我不确定它比Tries等具有什么优势,但是我已经读过好几次了,它对于文本挖掘非常有效。 我想就哪种数据结构最适合在这种情况下使用以及什么使它比其他结构更好的问题得到一些反馈。如果我缺少一些更适合拼写检查的数据结构,我也很感兴趣。

2
为什么C的void类型不同于Empty / Bottom类型?
维基百科以及我发现的其他来源都将C的void类型列为单位类型,而不是空类型。我觉得这很混乱,因为在我看来,它void更适合于空/底类型的定义。 void据我所知,没有价值观存在。 返回类型为void的函数指定该函数不返回任何内容,因此只能执行某些副作用。 类型的指针void*是所有其他指针类型的子类型。同样,void*在C中进行来回转换是隐式的。 我不确定最后一点是否可以作为void空类型的参数,void*或多或少是与无关的特例void。 另一方面,void它本身不是所有其他类型的子类型,据我所知,这是将类型作为底部类型的要求。
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

1
使用唯一元素编辑列表的距离
列表之间的Levenshtein-Distance编辑距离是一个经过充分研究的问题。但是如果知道每个列表中没有元素出现超过一次,我在可能的改进上找不到很多东西 。 我们还假设元素是可比较的/可排序的(但是要比较的列表并不是从头开始排序的)。 O(min(m,n)s)O(min(m,n)s)O(\min(m,n)s)sO (分钟(s ,m ,n )s )O(min(s,m,n)s)O(\min(s,m,n)s)sss 更正式地说, 我们如何有效地计算两个给定字符串s,t \ in \ Sigma ^ *之间的编辑距离 小号,吨∈ Σ∗s,t∈Σ∗s,t \in \Sigma^* ,并保证它们没有重复的字母? ΣΣ\Sigma是一个非常大的字母。


2
快速k不匹配字符串匹配算法
我正在寻找一种快速的k不匹配字符串匹配算法。给定长度为m的模式字符串P和长度为n的文本字符串T,我需要一种快速(线性时间)算法来查找P匹配T的子字符串(最多不匹配k个)的所有位置。这与k差问题(编辑距离)不同。不匹配意味着子字符串和模式在最多k个位置具有不同的字母。我真的只需要k = 1(最多1个不匹配),因此针对k = 1的特定情况的快速算法也足够了。字母的大小为26(不区分大小写的英文文本),因此空间要求不应随字母的大小而增长太快(例如,我相信FAAST算法占用的字母空间大小是指数的,因此仅适用于蛋白质和基因序列)。 在最坏的情况下,基于动态编程的方法将趋于O(mn),这将太慢。我相信对此有Boyer-Moore算法的修改,但是我无法获得此类论文。我没有订阅访问学术期刊或出版物的权限,因此任何参考文献都必须在公共领域。 我将不胜感激任何指针,或指向免费文档的引用,或针对此问题的算法本身。

1
用于编辑距离计算的微优化:有效吗?
在Wikipedia上,给出了自下而上的用于编辑距离的动态编程方案的实现。它没有完全遵循定义。内部单元的计算如下: if s[i] = t[j] then d[i, j] := d[i-1, j-1] // no operation required else d[i, j] := minimum ( d[i-1, j] + 1, // a deletion d[i, j-1] + 1, // an insertion d[i-1, j-1] + 1 // a substitution ) } 如您所见,如果存在匹配项,该算法始终从左上角的邻居中选择值,从而节省了一些内存访问,ALU操作和比较。 但是,删除(或插入)可能会导致较小的值,因此该算法在局部上是不正确的,即,它违反了最佳标准。但是也许错误不会改变最终结果-可能会消除它。 这种微优化有效吗?为什么不呢?

1
确定给定字符串与字符串集合的相似程度
我不确定这个问题是否属于这里,如果没有,我深表歉意。我要做的是开发一种编程方式,通过该方式我可以概率确定给定的字符串是否“属于”一袋字符串。例如,如果我有10,000个美国城市名称,然后有字符串“费城”,我想根据我已经知道的美国城市名称,用某种定量方法来衡量“费城”是美国城市名称的可能性。虽然我知道在这种情况下我无法将真实的城市名称与假的城市名称区分开,但我至少会希望排除诸如“ 123.75”和“快速的红狐狸跳过懒惰的棕色狗”之类的字符串一些门槛。 首先,我研究了Levenshtein距离,并探讨了如何将其应用于至少与我要解决的问题类似的问题。我发现的一个有趣的应用是窃检测,其中一篇论文描述了如何使用Levenshtein距离和改进的Smith-Waterman算法对纸张进行打分,并根据它们是给定原纸的抄袭版本的可能性进行评分。我的问题是,是否有人可以用其他可能对我有帮助的既定算法或方法为我指明正确的方向。我感觉这可能是过去有人试图解决的问题,但到目前为止,我的Google-fu无法使我成功。

1
将任意排列表示为一系列(插入,移动,删除)操作
假设我有两个字符串。打电话给他们和乙。两个字符串都没有重复的字符。一个一个A乙乙B 如何找到将变成B的最短插入,移动和删除操作序列,其中:一个一个A乙乙B insert(char, offset)char在给定offset的字符串中插入 move(from_offset, to_offset)将当前偏移的字符移动from_offset到新位置,使其具有偏移to_offset delete(offset) 删除处的字符 offset 示例应用程序:您执行数据库查询,并在您的网站上显示结果。以后,您重新运行数据库查询,发现结果已更改。您想要使用最少的DOM操作数来更改页面上的内容以匹配数据库中当前的内容。为什么要最短的操作顺序有两个原因。首先,效率。当只有几条记录更改时,您要确保执行而不是O(n )O(1)Ø(1个)\mathcal{O}(1)O (n )Ø(ñ)\mathcal{O}(n)DOM操作,因为它们很昂贵。第二,正确性。如果一项从一个位置移动到另一个位置,则您希望通过单个操作移动关联的DOM节点,而又不破坏和重新创建它们。否则,您将失去焦点状态,<input>元素的内容等。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.