- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的输入是三个数字-一个数字s
以及以b
为范围的开始e
和结束0 <= s,b,e <= 10^1000
。任务是找到s
与范围[b, e]
中所有数字之间的最小Levenstein距离。不必找到最小化距离的数字,最小距离就足够了。
显然,我必须将数字读取为字符串,因为标准C ++类型将无法处理这么大的数字。为可能在很大范围内的每个数字计算Levenstein距离是不可行的。
有任何想法吗?
最佳答案
[编辑10/8/2013:尽管考虑到它们不会导致不正确,但毕竟不必考虑DP算法中考虑的某些情况:)]
在下面的内容中,我描述了一种算法,该算法花费O(N ^ 2)时间,其中N是b,e或s中最大的数字位数。由于所有这些数字均限制为1000位,这意味着最多几百万个基本操作,而在任何现代CPU上,这将花费毫秒。
假设s有n位数字。在下文中,“在...之间”是指“包括”;如果我的意思是“排除其端点”,我将说“严格限制”。索引基于1。 x [i]表示x的第i个数字,例如x [1]是其第一位。
解决问题
首先要做的是将问题分解为一系列子问题,其中每个b和e具有相同的数字位数。假设e比k多k> = 0:将问题分解为k + 1个子问题。例如。如果b = 5且e = 14032,则创建以下子问题:
b = 5,e = 9
b = 10,e = 99
b = 100,e = 999
b = 1000,e = 9999
b = 10000,e = 14032
我们可以解决所有这些子问题,并采取最小的解决方案。
最简单的情况:中间
简单的情况是中间的情况。每当e比b多拥有k> = 1个数字时,将存在k-1个子问题(例如上述3个问题),其中b是10的幂,e是10的下一个幂减1。假设b是10 ^ m 。请注意,选择1到9之间的任何数字,然后选择0到9之间的任何m个数字,将生成范围为b <= x <= e的数字x。此外,在此范围内没有数字无法以此方式产生。 s(或实际上不是以0开头的任何给定的长度为n的数字字符串)与范围为10 ^ m <= x <= 10 ^(m + 1)-1的任何数字x之间的最小Levenshtein距离一定是abs(m + 1-n),因为如果m + 1> = n,则可以简单地选择x的前n个数字与s中的数字相同,然后删除其余部分,如果m + 1 < n然后选择第一个m + 1与s中的m + 1相同,然后插入剩余的m + 1。
实际上,我们可以在一个恒定时间操作中处理所有这些子问题:如果最小的“简单”子问题具有b = 10 ^ m,最大的“简单”子问题具有b = 10 ^ u,则之间的最小Levenshtein距离s,如果n
困难的情况:终结
困难的情况是b和e分别不限于形式为b = 10 ^ m和e = 10 ^(m + 1)-1。任何一个主问题最多可以生成这样的两个子问题:两个“结尾”(由b和e具有不同数字位数的主问题导致,例如顶部的示例)或一个子问题(即主问题)。问题本身,由于b和e已经具有相同的数字位数,因此根本不需要细分。注意,由于先前的问题分解,我们可以假定子问题的b和e具有相同的位数,我们将其称为m。
超级Levenshtein!
我们要做的是设计一个Levenshtein DP矩阵的变体,该矩阵计算给定数字字符串(s)与范围b <= x <= e中任何数字x之间的最小Levenshtein距离。尽管增加了此“功能”,该算法仍将在O(n ^ 2)时间内运行:)
首先,请注意,如果b和e的位数相同且b!= e,则必须是这样的情况:它们由左侧的相同位数q> = 0组成,然后是较大的位数在e中比在b中。现在考虑生成随机数字字符串x的以下过程:
将x设置为b的前q个数字。
在b [i]和e [i]之间将随机选择的数字d附加到x。
如果d == b [i],我们“拥抱”下界:
对于从q + 1到m的i:
如果b [i] == 9,则附加b [i]。 [2013年10月8日编辑:实际上这不会发生,因为我们选择q是为了使e [i]大于b [i],并且没有大于9的数字!]
否则,掷硬币:
标题:附加b [i]。
尾巴:附加一个随机选择的数字d> b [i],然后转到6。
停止。
否则,如果d == e [i],我们“拥抱”上限:
对于从q + 1到m的i:
如果e [i] == 0,则附加e [i]。 [EDIT 10/8/2013:实际上这不可能发生,因为我们选择q使得b [i]小于e [i],并且没有任何数字小于0!]
否则,掷硬币:
标题:附加e [i]。
尾巴:附加一个随机选择的数字d
停止。
否则(如果d严格在b [i]和e [i]之间),则跳至步骤6。
继续在x后面附加随机选择的数字,直到它有m个数字为止。
基本思想是,在包含所有必须包含的数字之后,您可以“拥抱”下界的数字,直到您想要的时间,或者“拥抱”下界的数字,只要您想要的时间,并且尽快当您决定停止“拥抱”时,此后可以选择所需的任何数字。对于合适的随机选择,此过程将生成所有且仅数字x,使得b <= x <= e。
在长度分别为n和m的两个字符串s和x之间的“常规” Levenshtein距离计算中,我们有一个从(0,0)到(n,m)的矩形网格,并且在每个网格点(i,j)我们记录前缀s [1..i]和前缀x [1..j]之间的Levenshtein距离。使用自下而上的动态编程,从(i-1,j),(i,j-1)和(i-1,j-1)的分数计算(i,j)的分数。为了使其适应于将x视为一组可能的字符串(特别是对应于b和e之间的数字的数字字符串)之一,而不是特定的给定字符串,我们需要做的是记录每个分数而不是两个网格点:一种情况,我们假设选择位置j处的数字以拥抱下限,而另一种情况我们假设选择位置j的数字以拥抱上限。第三种可能性(上面的第5步)实际上并不需要DP矩阵中的空间,因为我们可以立即计算出整个输入字符串其余部分的最小Levenshtein距离,这与我们为“简单”而设计出的方式非常相似第一部分中的子问题。
Super-Levenshtein DP递归
称网格点(i,j)v(i,j)的总体最低得分。如果字符a和b不同,则令diff(a,b)= 1,否则为0。如果字符a在b..c范围内,则使inrange(a,b..c)为1,否则为0。计算为:
# The best Lev distance overall between s[1..i] and x[1..j]
v(i, j) = min(hb(i, j), he(i, j))
# The best Lev distance between s[1..i] and x[1..j] obtainable by
# continuing to hug the lower bound
hb(i, j) = min(hb(i-1, j)+1, hb(i, j-1)+1, hb(i-1, j-1)+diff(s[i], b[j]))
# The best Lev distance between s[1..i] and x[1..j] obtainable by
# continuing to hug the upper bound
he(i, j) = min(he(i-1, j)+1, he(i, j-1)+1, he(i-1, j-1)+diff(s[i], e[j]))
# The best Lev distance possible between the ENTIRE STRINGS s and x, given that
# we choose to stop hugging at the jth digit of x, and have optimally aligned
# the first i digits of s to these j digits
sh(i, j) = if j >= q then shc(i, j)+abs(n-i-m+j)
else infinity
shc(i, j) = if j == q then
min(hb(i, j-1)+1, hb(i-1, j-1)+inrange(s[i], (b[j]+1)..(e[j]-1)))
else
min(hb(i, j-1)+1, hb(i-1, j-1)+inrange(s[i], (b[j]+1)..9),
he(i, j-1)+1, he(i-1, j-1)+inrange(s[i], (0..(e[j]-1)))
关于algorithm - Levenshtein与特定数字组的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13866211/
我在一本书(Interview Question)中读到这个问题,想在这里详细讨论这个问题。请点亮它。 问题如下:- 隐私和匿名化 马萨诸塞州集团保险委员会早在 1990 年代中期就有一个绝妙的主意
我最近接受了一次面试,面试官给了我一些伪代码并提出了相关问题。不幸的是,由于准备不足,我无法回答他的问题。由于时间关系,我无法向他请教该问题的解决方案。如果有人可以指导我并帮助我理解问题,以便我可以改
这是我的代码 public int getDist(Node root, int value) { if (root == null && value !=0) return
就效率而言,Strassen 算法应该停止递归并应用乘法的最佳交叉点是多少? 我知道这与具体的实现和硬件密切相关,但对于一般情况应该有某种指南或某人的一些实验结果。 在网上搜索了一下,问了一些他们认为
我想学习一些关于分布式算法的知识,所以我正在寻找任何书籍推荐。我对理论书籍更感兴趣,因为实现只是个人喜好问题(我可能会使用 erlang(或 c#))。但另一方面,我不想对算法进行原始的数学分析。只是
我想知道你们中有多少人实现了计算机科学的“ classical algorithms ”,例如 Dijkstra's algorithm或现实世界中的数据结构(例如二叉搜索树),而不是学术项目? 当有
我正在解决旧编程竞赛中的一些示例问题。在这个问题中,我们得到了我们有多少调酒师以及他们知道哪些食谱的信息。制作每杯鸡尾酒需要 1 分钟,我们需要使用所有调酒师计算是否可以在 5 分钟内完成订单。 解决
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
我开始学习 Nodejs,但我被困在中间的某个地方。我从 npm 安装了一个新库,它是 express -jwt ,它在运行后显示某种错误。附上代码和错误日志,请帮助我! const jwt = re
我有一个证书,其中签名算法显示“sha256rsa”,但指纹算法显示“sha1”。我的证书 SHA1/SHA2 的标识是什么? 谢谢! 最佳答案 TL;TR:签名和指纹是完全不同的东西。对于证书的强度
我目前在我的大学学习数据结构类(class),并且在之前的类(class)中做过一些算法分析,但这是我在之前的类(class)中遇到的最困难的部分。我们现在将在我的数据结构类(class)中学习算法分
有一个由 N 个 1x1 方格组成的区域,并且该区域的所有部分都是相连的(没有任何方格无法到达的方格)。 下面是一些面积的例子。 我想在这个区域中选择一些方块,并且两个相邻的方块不能一起选择(对角接触
我有一些多边形形状的点列表,我想将其包含在我页面上的 Google map 中。 我已经从原始数据中删除了尽可能多的不必要的多边形,现在我剩下大约 12 个,但它们非常详细以至于导致了问题。现在我的文
我目前正在实现 Marching Squares用于计算等高线曲线,我对此处提到的位移位的使用有疑问 Compose the 4 bits at the corners of the cell to
我正在尝试针对给定算法的约束满足问题实现此递归回溯函数: function BACKTRACKING-SEARCH(csp) returns solution/failure return R
是否有包含反函数的库? 作为项目的一部分,我目前正在研究测向算法。我正在使用巴特利特相关性。在 Bartlett 相关性中,我需要将已经是 3 次矩阵乘法(包括 Hermitian 转置)的分子除以作
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
问题的链接是UVA - 1394 : And There Was One . 朴素的算法是扫描整个数组并在每次迭代中标记第 k 个元素并在最后停止:这需要 O(n^2) 时间。 我搜索了一种替代算法并
COM 中创建 GUID 的函数 (CoCreateGUID) 使用“分散唯一性算法”,但我的问题是,它是什么? 谁能解释一下? 最佳答案 一种生成 ID 的方法,该 ID 具有一定的唯一性保证,而不
在做一个项目时我遇到了这个问题,我将在这个问题的实际领域之外重新措辞(我想我可以谈论烟花的口径和形状,但这会使理解更加复杂).我正在寻找一种(可能是近似的)算法来解决它。 我有 n 个不同大小的容器,
我是一名优秀的程序员,十分优秀!