Arrays DSA问题:从包含相同关联值的数组的数组中删除重复项

Arrays DSA问题:从包含相同关联值的数组的数组中删除重复项,arrays,algorithm,Arrays,Algorithm,假设我们有一个数组,其中包含一些数字: let arr = [ [1,2,3] ,[5,6,9] ,[2,1,3],[3,2,4],[4,3,5], [6,9,5] ] 此处arr[0]和arr[2]具有相同的关联值(1,2,3),尽管位置不同 相同的arr[1]和arr[5]具有相同的关联值(5,6,9),尽管位置不同 我要删除重复项,并希望得到以下结果: final= [ [1,2,3] ,[5,6,9] ,[3,2,4],[4,3,5] ] < > JavaScript或Python中

假设我们有一个数组,其中包含一些数字:

let arr = [ [1,2,3] ,[5,6,9] ,[2,1,3],[3,2,4],[4,3,5], [6,9,5] ]
此处arr[0]arr[2]具有相同的关联值(1,2,3),尽管位置不同

相同的arr[1]arr[5]具有相同的关联值(5,6,9),尽管位置不同

我要删除重复项,并希望得到以下结果:

final= [ [1,2,3] ,[5,6,9] ,[3,2,4],[4,3,5] ]
< > JavaScript或Python中的任何解决方案都是很棒的,其他的语言(如C++)也很受欢迎(我对这方面的知识很少),Pseudocode也很有帮助。
我想知道什么是最好的大O算法。

给定一个长度为
N*M
的两级数组(
N
元素,每个元素都是带有
M
数字的子数组),您必须至少查看一次
N*M
数字以检测重复。因此,一个硬下界是
O(N*M)
。一种非常简单的方法是将每个子数组与所有其他子数组进行比较,代价是
O(N*(N-1)*M*M)
,使用4个嵌套循环。这当然是可以改进的

一种可能性是对数组及其子数组进行排序(例如,使用子数组编号的字典顺序)。这需要
O((N log N)*(M log M))
时间,但允许查找一个子数组是否与O(M)中的另一个子数组相同-因为对于每个数字,您只需检查对应的数字是否相等。因此,对于这种方法,您得到的成本是
O((N logn)*(M logm))
(这比将所有内容排序后实际清除重复项所需的
O(N*M)
要大,因此在成本方面占主导地位)。这也非常接近最优

设arr=[[1,2,3],[5,6,9],[2,1,3],[3,2,4],[4,3,5],[6,9,5]]
函数重复排序(a){
//排序子数组
a=a.map(a=>a.sort())
//排序主数组
a=a.sort();
//定义两个子数组的相等性
常数相同=(x,y)=>{
如果(x.length!=y.length)返回false;
for(设i=0;i{
返回索引==0 | |!相同(项,a[index-1]);
});
}

console.log(deduplbysorting(arr));
您尝试过什么?它的大O复杂性是什么?这个问题仅限于二维
(a,b,c)
->
(b-a,c-a)
?你能给这个问题添加一些约束吗?我能把它看作是n x m,即n个单个数组,并且这n个数组中的每个数组都包含多达m个元素。如果n,m是一个哈希集,它定义为
等于
返回(x_b-x_a==y_-y_a)&(x_c-x_a==y_c-y_a)
可能会做得很好,这取决于您想要它的保证程度。很好,我非常喜欢这个答案。非常感谢