Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 快速计算大字符串之间距离的C代码或算法?_C#_Xml_Linq_Algorithm_Evolutionary Algorithm - Fatal编程技术网

C# 快速计算大字符串之间距离的C代码或算法?

C# 快速计算大字符串之间距离的C代码或算法?,c#,xml,linq,algorithm,evolutionary-algorithm,C#,Xml,Linq,Algorithm,Evolutionary Algorithm,嗨,谢谢你的关注 背景 我有一个包含1900个节点的XML文件,这些节点本身包含大约3400个字符的编码数据字符串 作为我正在开发的应用程序用例的一部分,我需要能够在运行时获取“基准”字符串,并从XML文件中找到最接近的匹配项 请注意,XML与应用程序并不密切相关,我可能会继续使用SQL,但今天,我只需要一个简单的地方来存储数据并证明这个概念 我正在使用.NET4.0、C#、表单应用程序、LINQ等 问题: 如何找到最接近的匹配项?哈明?莱文施坦?网上有很多代码示例,但大多数都是针对小字符串比较

嗨,谢谢你的关注

背景 我有一个包含1900个节点的XML文件,这些节点本身包含大约3400个字符的编码数据字符串

作为我正在开发的应用程序用例的一部分,我需要能够在运行时获取“基准”字符串,并从XML文件中找到最接近的匹配项

请注意,XML与应用程序并不密切相关,我可能会继续使用SQL,但今天,我只需要一个简单的地方来存储数据并证明这个概念

我正在使用.NET4.0、C#、表单应用程序、LINQ等

问题: 如何找到最接近的匹配项?哈明?莱文施坦?网上有很多代码示例,但大多数都是针对小字符串比较(“ant”和“aunt”)或精确匹配的。我很少有精确的匹配;我只需要最接近的匹配

提前谢谢

Matt

您提到使用Levenhstein的编辑距离,您的字符串大约有3400个字符长

我做了一个快速的尝试,使用动态编程版本的Levenhstein的编辑距离,它似乎相当快,不会引起任何问题

我这样做:

        final StringBuilder sb1 = new StringBuilder();
        final StringBuilder sb2 = new StringBuilder();
        final Random r = new Random(42);
        final int n = 3400;
        for (int i = 0; i < n; i++) {
            sb1.append( (char) ('a' + r.nextInt(26)) );
            sb2.append( (char) ('a' + r.nextInt(26)) );
        }
        final long t0 = System.currentTimeMillis();
        System.out.println("LED: " + getLevenshteinDistance(sb1.toString(), sb2.toString()) );
        final long te = System.currentTimeMillis() - t0;
        System.out.println("Took: " + te + " ms");
final StringBuilder sb1=新StringBuilder();
最终StringBuilder sb2=新StringBuilder();
最终随机数r=新随机数(42);
最终整数n=3400;
对于(int i=0;i
在2006年左右的Core 2 Duo上发现了215毫秒的距离

那对你有用吗


(顺便说一句,我不确定我是否可以粘贴我在这里得到的DP-LED实现的代码,因此您可能应该在Internet上搜索一个Java实现)

为了解决这个问题,您必须精确定义“最接近的”对您意味着什么。这更像是一个概念性问题,请尝试programmers.se。一旦你选择了一个算法,如果你在工作中遇到问题(或性能问题),StackOverflow会很乐意帮助你解决实现细节问题。@GregHewgill-Fair。对我来说,这意味着数据集中没有其他更接近的字符串。我猜这将类似于泡沫排序的结果。谢谢。@Greg Hewgill:他肯定是指RAM中位置的相对距离。@BenVoigt-谢谢,我会试试的。我过去在programmers.se上遇到的唯一问题是,它几乎没有这样的曝光率,因此很难在这里获得牵引力。@user988052-太棒了!非常感谢。这就是你正在使用的“GetLevenshteInstance”方法吗:?@MatthewPatrickCashatt:这很有趣。。。是的,它基本上是相同的,这是您应该用于大字符串的,因为它只初始化字符串长度的两个数组,而不是在一些(内存效率较低的)DP LED中可以看到的大小为N x N的矩阵;)这真是太好笑了——当上面的答案对我来说很有吸引力,并且帮助我在这方面取得了很大进步时,这个问题就以“不是真正的问题”和“无法合理回答”而结束了。也许是时候重新评估一些事情了,孩子们;)。