Questions tagged «strings»

有关符号序列,符号集及其属性以及用途的问题。

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

5
寻找有趣的字谜
假设和是两个长度相同的字符串。两个字符串的拼写是双射映射这样每个。a1a2…ana1a2…ana_1a_2\ldots a_nb1b2…bnb1b2…bnb_1b_2\ldots b_np:[1…n]→[1…n]p:[1…n]→[1…n]p:[1\ldots n]\to[1\ldots n]ai=bp(i)ai=bp(i)a_i = b_{p(i)}iii 同一对字符串可能不止一个拼写。例如,如果 `abcab`和我们有和等。a=a=a=b=b=b=cababp1[1,2,3,4,5]→[4,5,1,2,3]p1[1,2,3,4,5]→[4,5,1,2,3]p_1[1,2,3,4,5]\to[4,5,1,2,3]p2[1,2,3,4,5]→[2,5,1,4,3]p2[1,2,3,4,5]→[2,5,1,4,3]p_2[1,2,3,4,5] \to [2,5,1,4,3] 我们要说的是,词法的权重 是一个人必须在第一个字符串中进行剪切的次数,才能获得可以重新排列以获取第二个字符串的块。形式上,这是的值个数,其中。也就是说,它是在该点的数量不会不正好1.适用于例如增加,和,因为切割一次,进入块和,和切口4次,分为五个大块。w(p)w(p)w(p)pppi∈[1…n−1]i∈[1…n−1]i\in[1\ldots n-1]p(i)+1≠p(i+1)p(i)+1≠p(i+1)p(i)+1\ne p(i+1)pppw(p1)=1w(p1)=1w(p_1) = 1w(p2)=4w(p2)=4w(p_2) = 4p1p1p_11234512345p2p2p_212345 假设存在两个字符串和的拼写。然后,至少一个词法必须具有最小的权重。可以说这是最轻的。(可能有多个最简单的拼写;我不在乎,因为我只对权重感兴趣。)aaabbb 题 我想要一种算法,给定存在两个字符串的两个字串,它们可以有效地产生两个字符串最轻的字串的精确权重。如果该算法还能产生最轻巧的字词排序,也可以,但不是必须的。 生成所有拼写并对其进行加权是一件相当简单的事情,但是可能会有很多,所以我宁愿直接找到轻型拼写的方法。 动机 引起该问题的原因如下。使计算机搜索字典并查找字谜(包含完全相同的字母的单词对)非常容易。但是产生的许多字谜没有意思。例如,在《韦伯斯特第二国际词典》中找到的最长的例子是: 胆囊 十二指肠造口术十二指肠胆囊造口术 这个问题应该清楚:这些都是索然无味,因为他们承认一个很轻的anagramming,简单地交流cholecysto,duedeno和stomy段,对于一个体重2.在另一方面,这种更短的例子是更令人惊讶和有趣: 海岸线 剖面 这里最轻的字谜权重为8。 我有一个程序使用此方法来定位有趣的字谜,即所有字谜的权重很高的字谜。但这是通过生成并加权所有可能的拼写来实现的,这很慢。

1
是否有支持这些字符串操作的“字符串堆栈”数据结构?
我正在寻找一种数据结构,该结构可在字符集上存储一组字符串,该字符集能够执行以下操作。我们将为存储字符串集合的数据结构。D(S )SΣΣ\SigmaD(S)D(S)\mathcal{D}(S)SSS Add-Prefix-Set在:给定一组(可能为空)字符串,其大小由一个常数限制,而字符串长度由一个常数限制,则返回。这两个边界常量都是全局的:对于所有输入它们都是相同的。Ť d({ 吨小号|吨∈ Ť ,小号∈ 小号} )ŤD(S)D(S)\mathcal{D}(S)TTTD({ts | t∈T,s∈S})D({ts | t∈T,s∈S})\mathcal{D}( \{ t s\ |\ t \in T, s \in S\} )TTT Get-Prefixes在:返回。请注意,只要我可以在时间内枚举其内容,我就不介意此集合使用什么结构。{ a | 一个小号∈ 小号,一个∈ Σ } Ö (|Σ |)D(S)D(S)\mathcal{D}(S){a | as∈S,a∈Σ}{a | as∈S,a∈Σ}\{ a \ | \ as \in S, a \in \Sigma \}O(|Σ|)O(|Σ|)O(|\Sigma|) Remove-Prefixes在D(S)D(S)\mathcal{D}(S):返回D({s …

1
字符串中最长的重复(分散)子序列
非正式问题陈述: 给定一个字符串(例如,我们希望将一些字母成红色,将一些字母成蓝色(有些根本不),这样,从左到右仅读取红色字母会产生与仅读取蓝色字母相同的结果。ACCABBABACCABBABACCABBAB 在示例中,我们可以为它们着色:ACCABBABACCABBABA\color{blue}{C}\color{red}{CAB}B\color{blue}{AB} 因此,我们说是的重复子。它也是最长的重复子序列(易于检查)。A C C A B B A BCABCABCABACCABBABACCABBABACCABBAB 我们可以有效地计算最长的重复子序列吗? 正式问题: 确定字符串和某个是否难为NP,字符串中是否存在长度为的重复子序列?ķkkkkkk 如果是这样:哪个问题可以减少到这个问题? 如果不是:什么是有效算法?(显然,此算法可用于计算最长的重复子序列) 奖励问题: 如果字母的大小受常数限制,它们将始终是长度为的重复子序列吗?n/2−o(n)n/2−o(n)n/2 - o(n) (这对于二进制字母来说是正确的。) 编辑2:对于奖金问题的否定答案,众所周知的是大小至少为字母。实际上,对于大小为Σ的字母,存在具有最长重复子序列且长度仅为O(n·Σ^ {-1/2})的字符串。随机字符串足以证明这一点。结果已经存在,但我忽略了它。555ΣΣΣO(n⋅Σ−1/2)O(n·Σ−1/2)O(n · Σ^{-1/2}) 编辑: 注意: 有些人说“子序列”时,其意思是“子串”。我不。这不是找到子字符串两次的问题。

2
高效的地图数据结构,支持近似查找
我正在寻找一种数据结构,该结构支持有效的键近似查找(例如,字符串的Levenshtein距离),并为输入键返回最接近的匹配项。到目前为止,我找到的最合适的数据结构是Burkhard-Keller树,但是我想知道是否还有其他/更好的数据结构用于此目的。 编辑:我的具体情况的更多详细信息: 字符串之间的Levenshtein差异通常很大。 字符串的最大长度约为20到30个字符,平均长度接近10到12个字符。 我对有效查找比对插入更感兴趣,因为我将构建一组要有效查询的大部分静态数据。

1
域名压缩
此问题是从Stack Overflow 迁移而来的,因为可以在Computer Science Stack Exchange上回答。 迁移 7年前。 我对如何紧凑压缩任意IDN主机名(由RFC5890定义)的域感到好奇,并怀疑这可能会成为一个有趣的挑战。Unicode主机或域名(U标签)由一串Unicode字符组成,通常取决于顶级域名(例如,下的希腊字母.gr),被限制为一种语言,该Unicode字符被编码为以xn--(一个标签)。 人们不仅可以根据以下正式要求来建立数据模型: 每个非Unicode标签都是一个字符串匹配^[a-z\d]([a-z\d\-]{0,61}[a-z\d])?$; 每个A标签都是一个字符串匹配^xn--[a-z\d]([a-z\d\-]{0,57}[a-z\d])?$;和 整个域的总长度(A标记和非IDN标记以“。”分隔符连接)不超过255个字符 而且还来自各种启发式方法,包括: 低阶U标签在某些自然语言中通常在词法,句法和语义上都是有效的短语,包括专有名词和数字(连字符除外,不加标点,去除空白并按Nameprep折叠),偏爱较短的短语;和 高阶标签是从SLD和TLD的字典中​​提取的,并为预测低阶标签中使用哪种自然语言提供了上下文。 我担心,如果不考虑数据的这些特定特征,很难对这样的短字符串进行良好的压缩,此外,现有的库将产生不必要的开销,以适应其更一般的用例。 阅读Matt Mahoney的在线书《Data Compression Explained》,很显然,可以利用许多现有技术来利用上述(和/或其他)建模假设,与不那么具体的工具相比,它们应该带来更好的压缩效果。 就上下文而言,此问题是SO上一个问题的分支。 最初的想法 令我惊讶的是,这个问题是脱机培训的绝佳选择,我设想了以下几行的压缩数据格式: 霍夫曼编码的“ 公共后缀 ”,其概率来自域名注册或流量的某些公开来源; 其余的U标签使用霍夫曼编码(自然语言)模型,并从给定的域后缀上下文中某些已发布的域注册或业务量来源中提取概率; 应用来自指定自然语言模型的一些基于字典的转换;和 U标签中每个字符的算术编码,其概率来自脱机训练(甚至可能是在线,但我怀疑数据可能太短而无法提供任何有意义的见解?)的上下文自适应自然语言模型。

1
每个足够大的字符串都重复吗?
令为固定大小的有限字符集。令α为Σ上的一些字符串。我们说一个非空子串β的α是一个重复的,如果β = γ γ对于一些字符串γ。ΣΣ\Sigmaαα\alphaΣΣ\Sigmaββ\betaαα\alphaβ= γγβ=γγ\beta = \gamma \gammaγγ\gamma 现在,我的问题是以下条件是否成立: 对于每一个,存在一些Ñ ∈ Ñ使得对于每个字符串α超过Σ至少长度的Ñ,α含有至少一个重复。ΣΣ\Sigman∈Nn∈Nn \in \mathbb{N}αα\alphaΣΣ\Sigmannnαα\alpha 我已经对二进制字母进行了检查,在这种情况下,这非常容易,但是大小为3的字母已经很难检查了,我是否想证明任意大的语法。 如果上述猜想是正确的,那么我可以(几乎)消除在其他问题中插入空字符串的需求。

1
Ukkonen算法的运行时间如何取决于字母大小?
我担心Ukkonen算法的渐近运行时间问题,它可能是在线性(?)时间构造后缀树的最流行算法。 这是丹·古斯菲尔德(Dan Gusfield)撰写的《关于字符串,树和序列的算法》(第6.5.1节)的引用: “ ... Aho-Corasick,Weiner,Ukkonen和McCreight算法都需要空间,或者O (m )时限应替换为O (m log m )和O的最小值(m log | Σ |) ”。Θ (m | Σ |)Θ(米|Σ|)\Theta(m|\Sigma|)O (米)Ø(米)O(m)Ø (米日志m )Ø(米日志⁡米)O(m \log m)Ø (米日志| Σ | )Ø(米日志⁡|Σ|)O(m \log|\Sigma|) [ 是字符串长度,Σ是字母的大小]米米mΣΣ\Sigma 我不明白为什么这是真的。 空间:好吧,如果我们使用大小为数组表示节点外的分支,那么实际上,我们最终会占用Θ (m | Σ |)空间。但是,据我所知,还可以使用哈希表(例如Python中的字典)存储分支。这样一来,我们将只将Θ (m )指针存储在所有哈希表中(因为树中有Θ (m )个边),同时仍然能够访问O (1 )中的子节点。Θ(|Σ|)Θ(|Σ|)\Theta(|\Sigma|)Θ (米|Σ|)Θ(m|Σ|)\Theta(m|\Sigma|)Θ (米)Θ(m)\Theta(m)Θ (米)Θ(米)\Theta(m)Ô (1 )Ø(1个)O(1) …

3
切割字符串的动态编程练习
我一直在研究本书中的以下问题。 某种字符串处理语言提供了一种原始操作,该操作将字符串分成两部分。由于此操作涉及复制原始字符串,因此与剪切位置无关,长度为n的字符串要花费n个时间单位。现在,假设您要将一个字符串分成许多段。中断的顺序可能会影响总运行时间。例如,如果要在位置以切割20个字符的字符串和,然后在位置使第一切口即被的总成本,而这样做位置10首先具有更好的成本。10 3 20 + 17 = 37 20 + 10 = 3033310101033320+17=3720+17=3720 + 17 = 3720+10=3020+10=3020 + 10 = 30 我需要一种动态编程算法,该算法可给出剪切,以找到将字符串剪切成片段的最低成本。m + 1mmmm+1m+1m +1


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
Aho-Corasick算法和Rabin-Karp算法的比较
我正在研究支持多模式搜索的字符串搜索算法。我发现了两种算法,它们在运行时间方面似乎是最强的候选者,分别是Aho-Corasick和Rabin-Karp。但是,我找不到这两种算法之间的任何全面比较。哪种算法更有效?另外,哪一种更适合并行计算和多模式搜索?最后,哪个需要更少的硬件资源? 对于AC算法,搜索阶段需要时间,而对于RK ,搜索阶段则为。但是,RK的运行时间为,这使其类似于AC。我的初步结论是,RK看起来实际上更好,因为它不需要像AC一样多的内存。那是对的吗?O (n + m )Ø(ñ+米)O(n+m)O (n 米)Ø(ñ米)O(nm)O (n + m )Ø(ñ+米)O(n+m)

5
复杂度为O(n)的词频
在接受Java开发人员职位面试时,有人问我以下问题: 编写一个具有两个参数的函数: 代表文本文档的字符串,以及 提供要返回的项目数的整数。 实现函数,使其返回按单词频率排序的字符串列表,最频繁出现的单词在前。您的解决方案应在时间运行,其中是文档中的字符数。nO (n )O(n)O(n)ñnn 以下是我的回答(用伪代码),由于排序,它不是,而是时间。我不知道该怎么做时间。 O (n log n )O (n )O (n )O(n)O(n)Ø (ñ 日志n )O(nlog⁡n)O(n \log n)O (n )O(n)O(n) wordFrequencyMap = new HashMap<String, Integer>(); words = inputString.split(' '); for (String word : words) { count = wordFrequencyMap.get(word); count = (count == null) ? 1 : …

1
查找最长斐波那契子串的幼稚算法的复杂性
给定两个符号和b,我们如下定义第k个斐波那契字符串:一个a\text{a}bb\text{b}ķkk F(k )= ⎧⎩⎨b一个F(ķ - 1 )⋆ ˚F(k − 2 )如果 k=0如果 k=1其他F(k)={bif k=0aif k=1F(k−1)⋆F(k−2)else F(k) = \begin{cases} \text{b} &\mbox{if } k = 0 \\ \text{a} &\mbox{if } k = 1 \\ F(k-1) \star F(k-2) &\mbox{else} \end{cases} 与表示字符串连接。⋆⋆\star 因此,我们将拥有: F(0 )= bF(0)=bF(0) = \text{b} F(1 )= 一个F(1)=aF(1) = \text{a} F(2 …

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

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.