2017-06-22 22 views
0

Javascriptで配列の配列から一意の組み合わせを生成しようとしています。この例ではネストされた配列(JS)から一意の組み合わせを生成

Input: [ [1,1,3], [3,1,1], [4,4,4] ] 
Output: [ [1,1,3], [4,4,4] ] 

[3,1,1][1,1,3]の重複です。セットに数値を追加することは、重複配列の問題を解決するようではなく、ソートされた文字列化された配列をハッシュすることはハックのようです。

編集:文字列配列が含まれていない場合は、その解決法を探します。

これを解決する方法がありますか?

+0

あなただけのユニークな配列を探したりもしていますそれらの配列の組み合わせ - 例えばパワーセット? –

+0

組み合わせだけなので、同じ番号の配列を異なる順序でドロップします。 – colorbynumber

+0

あなたはそれをするために少しのプログラムを書く必要があるようです。まず、配列と要素を異なる順序で比較する方法を含め、英語で行う必要があることを書き留めます。次に、JavaScriptプログラムとして記述します。 –

答えて

0
var output=Object.keys(input.reduce((obj,el)=>(obj[el.sort().join()]=true,obj),{})).map(arr=>arr.split().map(e=>+e)); 

あなたは彼らが等しくなるように、配列をソートして、全部を一意にするために、ハッシュテーブルを使用することができます。

+0

動作例については、http://jsbin.com/cutabazetu/edit?consoleを参照してください。 –

+0

ニース、intにキャストするために再度マップする必要があります。しかし、これは私が避けようとしている「並べ替えられた、文字列化された配列をハッシングする」ことです。 – colorbynumber

+0

@colorbynumberなぜですか?それは間違いなく最も簡単です... –

1

ソートされた文字列配列を使用して、それに応じてフィルタを使用することができます。文字列化された配列ではないが、しかし、最初のキーとして長を使用するネストされたハッシュテーブルと

var array = [[1, 1, 3], [3, 1, 1], [4, 4, 4]], 
 
    unique = array.filter(
 
     (s => a => (p => !s.has(p) && s.add(p))(a.slice().sort((a, b) => a - b).join()))(new Set) 
 
    ); 
 

 
console.log(unique);

Aわずかに異なるアプローチ。

var array = [[1, 1, 3], [3, 1, 1], [4, 4, 4]], 
 
    unique = array.filter(function (hash) { 
 
     return function (a) { 
 
      var found = true; 
 
\t \t \t \t 
 
      a .slice() 
 
       .sort(function (a, b) { return a - b; }) 
 
       .reduce(function (r, k) { 
 
        found = found && r[k]; 
 
        return r[k] = r[k] || {}; 
 
       }, hash[a.length] = hash[a.length] || {}); 
 
      return !found; 
 
     }; 
 
    }(Object.create(null))); 
 

 
console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

マッピングアレイプリミティブハッシュ値を効率的に重複を識別することを可能にする - あなたのケース順列に。

単純なハッシュ関数は、配列をソートして結合または文字列化することによって与えられます。避けることをお勧めします。

範囲が限定された整数配列の場合、各整数nをn番目の素数に対応付けることができます。それらの素因数の積はあなたのハッシュです。製品には、これは素数の可能性に大きな配列を格納することのコストでソートよりも高速で、線形時間で計算することができますので:

const primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61]; 
 

 
function hash(numbers) { 
 
    return numbers.reduce((prod, n) => prod * primes[n], 1); 
 
} 
 

 
function unique(arrays) { 
 
    let set = new Set(); 
 
    return arrays.filter(numbers => { 
 
    let h = hash(numbers); 
 
    return !set.has(h) && set.add(h); 
 
    }); 
 
} 
 

 
console.log(unique([[1,1,3], [3,1,1], [4,4,4]]));

+0

地図とニナのセットの使用の間のランタイムの複雑さの違いは何ですか? – Rick

+1

こんにちは@Arrow、実行時の複雑さには違いはありませんが、二番目の考えでは、 'Map.values()'イテレータがここであまり意味を成さないので、むしろ 'Set'を使うと思います。 –

関連する問題