如何判断两组序列的循环是否相等?
有一组数组,我想删除后面相等的重复元素旋转:arr={1,2,3,4,5},{2,3,4,5,1},{5,1,2,3,4},{4,3,2,5,1};元素{1,2,3,4,5},{2,3,4,5,
解答动态
另一个想法是利用循环规范化的事实。为了示例:
周期[{5,1,2,3,4}}] 周期[{1,2,3,4,5}}]
So,
DeleteDuplicatesBy[arr,Cycles@*List] {1,2,3,4,5},{4,3,2,5,1}}
可能是
DeleteDuplicatesBy[arr,Mod[#-#[[1]],5]amp;] 它通过确定最小的条目并在前面旋转来规范arr的条目。
如果我们将列表元素视为在每个连续对之间具有边的图顶点(循环),那么如果两个列表可以映射到具有相同边的图,那么这两个列表是等价的。在代码:
[列表]:=<;#-gt;旋转左[#]]&;/@列表
lt;lt;lt;gt;1},{2、2、3、3、4、3、3、3、3、4、4、4、4、4、4、4、5、5、5、5、5、5、5、5、1}、、、、各各你知道吗,1} -gt;4,2-gt;2,4-gt;1}
>;*) 和:
deleteplicatesby[arr,graphs[arr]](*{1,2,3,4,5},{4,3,2,5,1}*)arr={1,2,3,4,5},{2,3,4,5,1},{5,1,2,3,4},{4,3,2,5,1};DeleteDuplicatesBy[list,Sort[Table[RotateLeft[#,i],{i,1,5}]]&;]//长度 2
最简单和最稳定的解决方案是通过[arr,Sort[NestList[RotateLeft,?,Length[?]-1]]amp;] 设计类似于删除重复项的解决方案,但后者只有在您知道没有重复项时才起作用在每个组。用于例如,对于
arr={1,2,2},{2,1,2}不起作用; 前一种解决方案总是起作用,但速度较慢。例如,对于
arr=Table[RandomSample[Range[7]],10^4]; ,平均评估时间相差3(0.062秒)。
使用Cy定义轨道索引clicGroup:
orbitIndex=关联[Join@@@MapIndexed[Thread[#-amp;]@GroupOrbits[CyclicGroup[Length@First@@#],#,Permute]]amp;] {{1,2,3,4,5},{4,3,2,5,1}} 重复元素:
arr2=啊/。3-;、quot;,quot;,quot;,quot;,quot;} 删除重复项按[arr3,轨道索引[arr3]] {{Aquot;Bquot;Cquot;Dquot;Equot;,quot;,quot;,quot;,quot;} 删除重复项[arr3,orbitIndex[arr3][#]==orbitIndex[arr3][#2]quot;,quot;,quot;,quot;,quot;},{Dquot;Cquot;Bquot;Equot;A";}}- End
免责声明:
本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。