2016-10-12 14 views
0

私はそれぞれが0以上のポイントを含むノードのセットを持っています。ノード間に重複したポイントがありますが、各ノードにはそのノードに固有のポイントが含まれている場合があります。例えばJavascriptでほとんどのポイントを持つノードを最も少なく見つける最適な方法

  • ノードA
    • ポイント1
    • ポイント2
    • ポイント3
  • ノードB
  • ノードC
    • ポイント1
    • ポイント4
  • ノードD
    • ポイント2

見つけるアルゴリズム又は方法があります。共同するノードの数が最も少ない最も多くのポイントを特定の限度まで獲得していますか?上記の例では

は、私は4つのユニークなポイントを必要に応じて、私は現在、ノードAとノードC、またはノードAとノードD

になるだろう、私は内のノードのリストをソートすることにより、この問題を解決しています(ノードA、ノードC、ノードD)とポイントを持たないノード(ノードB)を廃棄することによって、降順に並べ替えることができます。私は、ユニークなポイントの定義されたしきい値を打つまで、ユニークなポイントを数える(そして、ノードが見ているものを記録する)ノードのリストを繰り返しています。上記の例では、ノードAとノードCの結果が返されます。

私はJavascriptでこれをやっていますが、私の質問は「問題を解決する方法」です。特定の言語には関係しません。これが間違った投稿場所である場合はお詫び申し上げます。

+0

あなたが持っているすべては、あなたの方法は、私がソートbeforユニークなポイントをカウントして、ソートのユニークなポイント数ですけれども、実行できるよう最善についてのデータである場合。有効性はもちろん、データに依存します。そのデータの生成を管理している場合は、ノードの各ポイントのリストを保持し、ノード内のユニークなポイントの追加カウントを追加することによって、検索を最適化することができます。 – Blindman67

+0

あなたはすでに解決している解決策を見つけました。あなたは何を改善したいですか?優雅?効率?速度?あなたはどのくらいの頻度で操作を行う必要がありますか?あなたのユースケースは何ですか? – Bergi

+0

「ノードAとノードD」から4つのユニークなポイントを取得することについての声明では、おそらく問題に関する何かがあると思われます。ノードAとノードD内のユニークなポイントの数は、ポイント2が重複しているので3です。 –

答えて

1

私が見ることのできるところでは、制限なしで、Set Coverの削減は簡単です。あなたの制限は指定されていないので、すべての可能な点に及ぶ可能性があります。そのため、ブルートフォースだけが実行可能な選択肢です。制限をさらに指定する必要がある場合でも、私はまだそれがNP完全であると推測します。

ソート後に最初のn個のノードには重複したポイントがたくさんあり、ポイントが少ないノードを含めると「良い」ことができます。

+0

OPは必ずしも宇宙全体をカバーしたくないので、セットカバーの問題とは関係ありません。 – Bergi

+0

@Bergiは「制限なし」と書かれています。彼はさらに彼の限界に制約を加えなかった。例えば。彼の例では、限界が4であれば、それはすべての点が含まれているのと同じです。そして、ウィキペディアの言葉では、宇宙はすべての点であり、集合の集合はノードの集合です。ユニークな点の最大量を持つノードの最小量が検索されます。これは、ユニバースであるノードの和集合のすべてと等価です。制限付き。 12、私はそれがNP完全であると推測するだけです。 – ASDFGerte

+0

ああ、そうです。しかし、私はそれが問題を本当に興味深いものにする限界だと思う:-D – Bergi

0

すべての可能な組み合わせを構築し、値を合計し、ターゲット値をフィルタリングし、結果セットを必要な制約に並べ替えることができます。

結果として上位項目を取ります。

var array = [3, 0, 2, 1], 
 
    i, 
 
    result = [], 
 
    values, 
 
    sum; 
 

 
// filter zero values 
 
array = array.filter(function (a) { 
 
    return a; 
 
}); 
 

 
// generate all possible combination and build sum 
 
for (i = 0; i < 1 << array.length; i++) { 
 
    sum = 0; 
 
    values = array.filter(function (a, j) { 
 
     if (i & (1 << j)) { 
 
      sum += a; 
 
      return true; 
 
     } 
 
    }); 
 
    // add only relevant items to the result set 
 
    sum >= 4 && result.push({ values: values, sum: sum }); 
 
} 
 

 
// sort by priority 
 
result.sort(function (a, b) { 
 
    return a.values.length - b.values.length || a.sum - b.sum; 
 
}); 
 

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

+0

合計をとるときは、重複を除外する必要があります(ポイントは複数のノードの一部になることがあります)。しかしいずれにせよ、それはOPが現在やっていることよりはるかに非効率的に聞こえる。 – Bergi

関連する問題