Wolfram mathematica 在列表中查找相等或相似的序列

Wolfram mathematica 在列表中查找相等或相似的序列,wolfram-mathematica,Wolfram Mathematica,我需要将一个列表转换为一个空列表,如果它有两个具有特定属性的非重叠序列。例如,在这种情况下,等于且长度>=2 mm[{___, b1__, ___, b1__, ___}] := {} /; Length[{b1}] >= 2 或者,例如2个子列表,相似性函数等于0和 长度=4 mm[{___, b1__, ___, b2__, ___}] := {} /; NeedlemanWunschSimilarity[{b1}, {b2}] == 0 && Length[{b1}

我需要将一个列表转换为一个空列表,如果它有两个具有特定属性的非重叠序列。例如,在这种情况下,等于且长度>=2

mm[{___, b1__, ___, b1__, ___}] := {} /; Length[{b1}] >= 2
或者,例如2个子列表,相似性函数等于0和 长度=4

mm[{___, b1__, ___, b2__, ___}] := {} /;
NeedlemanWunschSimilarity[{b1}, {b2}] == 0 && Length[{b1}] == 4 &&
Length[{b2}] == 4
等等

对于精通内部算法的大师mathematica来说,有没有更快的方法
通过这种方式,或许可以使用PatternTest?

我在等待您对所做工作的更全面描述,但同时:

mm2[{___, b1 : Repeated[_, {4}], ___, b2 : Repeated[_, {4}], ___}] := {} /; 
  NeedlemanWunschSimilarity[{b1}, {b2}] == 0
这仅用于测试正确长度的序列


您可以使用重复的[_,{min,max}]指定最小和最大序列长度。

我等待您对所做操作的更全面描述,但同时:

mm2[{___, b1 : Repeated[_, {4}], ___, b2 : Repeated[_, {4}], ___}] := {} /; 
  NeedlemanWunschSimilarity[{b1}, {b2}] == 0
这仅用于测试正确长度的序列



您可以使用重复的[_,{min,max}]指定最小和最大序列长度。

列表中的元素是什么?你能提供样品清单吗?你需要处理的最大序列长度是多少?我总是测试一个二进制列表,比如,{0,1,0,1,…,0},如果两个不总是具有相同长度的非重叠部分是另一个的简单转换,我需要测试False或True。我的意思是变换,比如,等式,无变换,旋转,反转等等。。。或者有一种更快的方法可以做到这一点?为了真正获得一个有效的解决方案,您需要为您感兴趣的每个转换提供一个函数,使您的序列具有某种规范形式。否则,任何解决方案都必须执行成对比较,这意味着如果n是列表的长度,它将位于^2。“人们也许能够使用一些技巧优化n^2前面的常数因子,在某些情况下可能会非常显著,但对于真正大的列表,这不会有多大帮助。”Leonid Shifrin。你能更好地解释一下你的意思吗?例如,对于字符串旋转,这可能是对字符串字符进行排序。一般来说,这是一个函数,当应用于不同的表达式序列时,我们想把它们转换成相同的表达式。这将允许根据序列的等价类对序列进行有效分组。拥有这样一个功能比拥有一个比较功能更重要。你的列表中有哪些元素?你能提供样品清单吗?你需要处理的最大序列长度是多少?我总是测试一个二进制列表,比如,{0,1,0,1,…,0},如果两个不总是具有相同长度的非重叠部分是另一个的简单转换,我需要测试False或True。我的意思是变换,比如,等式,无变换,旋转,反转等等。。。或者有一种更快的方法可以做到这一点?为了真正获得一个有效的解决方案,您需要为您感兴趣的每个转换提供一个函数,使您的序列具有某种规范形式。否则,任何解决方案都必须执行成对比较,这意味着如果n是列表的长度,它将位于^2。“人们也许能够使用一些技巧优化n^2前面的常数因子,在某些情况下可能会非常显著,但对于真正大的列表,这不会有多大帮助。”Leonid Shifrin。你能更好地解释一下你的意思吗?例如,对于字符串旋转,这可能是对字符串字符进行排序。一般来说,这是一个函数,当应用于不同的表达式序列时,我们想把它们转换成相同的表达式。这将允许根据序列的等价类对序列进行有效分组。拥有这样一个函数比拥有一个比较函数要求更高。我的任务是在两个不重叠的子序列是一个时标记一个列表,另一个的变换基本上相等,一个是另一个的旋转,另一个是相反的,依此类推。在我看来uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!所以我想象每一条捷径possible@user顺便说一下,欢迎来到StackOverflow。你有没有用我上面展示的重复测试过表格?此外,如果没有更多的数据知识,很难优化解决方案。如果您想要一个非常通用和灵活的解决方案,可能很难打败我上面展示的形式。序列是否总是相同的长度?您列表中的所有元素是否都是相同类型的浮点、整数等?@user1063646在不知道精确比较测试的情况下,我看到的唯一解决方案是测试所有可能性选择所有子序列并进行比较。这就是Mathematica使使用模式匹配变得非常容易的地方。但很明显它很慢。另外:请在原始问题中添加计算,这样每个人都可以很容易地看到它们。@Szabolcs它仍然可以比他的初始模式快得多。我希望我的回答能对你有所帮助。谢谢你的欢迎。序列的长度并不总是相同的,但通常是最小的
长度n;在每种情况下都应用于整数,即二进制列表,es{0,1,1,…,0}我的任务是标记一个列表,当两个不重叠的子序列是一个时,另一个的变换基本上是相等的,一个是另一个的旋转,另一个是相反的,等等。在我看来uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!所以我想象每一条捷径possible@user顺便说一下,欢迎来到StackOverflow。你有没有用我上面展示的重复测试过表格?此外,如果没有更多的数据知识,很难优化解决方案。如果您想要一个非常通用和灵活的解决方案,可能很难打败我上面展示的形式。序列是否总是相同的长度?您列表中的所有元素是否都是相同类型的浮点、整数等?@user1063646在不知道精确比较测试的情况下,我看到的唯一解决方案是测试所有可能性选择所有子序列并进行比较。这就是Mathematica使使用模式匹配变得非常容易的地方。但很明显它很慢。另外:请在原始问题中添加计算,这样每个人都可以很容易地看到它们。@Szabolcs它仍然可以比他的初始模式快得多。我希望我的回答能对你有所帮助。谢谢你的欢迎。序列的长度并不总是相同的,但通常具有最小长度n;在每种情况下都应用于整数,即二进制列表,es{0,1,1,…,0}