他のすべてからどれくらい離れているかを数えます


13

等しい長さの2つのストリング間のハミング距離は、対応するシンボルが異なる位置の数です。

してみましょうP長さのバイナリ文字列にするnT長さのバイナリ文字列です2n-1。のすべての長さの部分文字列のn間のハミング距離を左から右に順番に計算し、それらを配列(またはリスト)に入れることができます。PnT

ハミング距離シーケンスの例

させP = 101てくださいT = 01100。このペアから得られるハミング距離のシーケンスは2,2,1です。

近さの定義

次に、このようなハミング距離のシーケンスを2つ考えてみましょう。と言うx = (0, 2, 2, 3, 0)y = (2, 1, 4, 4, 2)例として。私たちはそれを言ってxおりycloseもしy <= x <= 2*yそうならx <= y <= 2*x。ここで、スカラー乗算と不等式は要素ごとに取られています。つまり、2つのシーケンスABA <= B iff A[i] <= B[i]すべてのインデックスに対してi

ハミング距離のシーケンスは、これらの比較方法では半順序を形成することに注意してください。言い換えれば、シーケンスの多くのペアは、互いに大きくも等しくも小さくも等しくありません。たとえば(1,2)(2,1)

したがって、上記の例を使用して、(0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)しかし(0, 2, 2, 3, 0)より大きくありません(2, 1, 4, 4, 2)。また、以下で(2, 1, 4, 4, 2)はありません2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)。その結果xy互いに近接ではありません。

仕事

増加のためnで始まるn=1、バイナリ文字列のすべての可能なペアを検討P長さのnT長さのを2n-1。その2^(n+2n-1)ようなペアがあるため、ハミング距離の多くのシーケンスがあります。ただし、これらのシーケンスの多くは同一になります。タスクは、2つのシーケンスが互いに近接しないように、ハミング距離シーケンスの最大セットのサイズを見つけることです。

コードはの値ごとに1つの数値を出力する必要がありますn

スコア

あなたのスコアは大まかに言って、nあなたのコードが私のマシン上で5分以内に到達する最高のものです(しかし、読んでください)。タイミングは、それだけの時間ではなく、総実行時間の時間ですn

最適な回答を見つけるのは難しいと思われるため、非最適な回答のスコアを与えるには、わずかに微妙なスコアリングシステムが必要になります。あなたのスコアは、nこれよりも小さいサイズに対して他の誰もより高い正解を投稿していない最高値です。たとえば、あなたが出力し2, 4, 21、他の誰かが出力した場合2, 5, 15、あなたは1他の誰かがより良い答えを持っているとしてのみスコアリングしますn = 2。出力する場合、他の誰かが何を出力しても、それらの答えはすべて最適であるため、2, 5, 21スコアが付け3られます。明らかに、すべての最適な回答があれば、n投稿した最高のスコアが得られます。しかし、たとえあなたの答えが最適でなくても、他の誰もそれを打つことができないなら、あなたはまだスコアを得ることができます。

回答例と実施例

(この回答はまだチェックされていません。独立した検証はありがたいことに受信されます。)

ETHproductionsのおかげで:

  • n = 1は2を与えます。
  • n = 2は5を与えます。
  • n = 3は21を与えます。

n = 2もっと詳しく見てみましょう。この場合、ハミング距離シーケンスの完全なリスト(ここではタプルで表されます)は次のとおりです。

[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

(0,0)他のタプルの近くにないことがわかります。我々が取る場合、実際には(0, 0)(0, 1)(1, 0)(2, 1)(1,2)その後、それらのタプルのどれもが他の人のいずれかに近いではありません。これによりのスコアが得5られn = 2ます。

以下のためにn = 3個別のハミング距離シーケンスの完全なリストであります:

 [(0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 3, 2), (3, 3, 3)]

これらの48シーケンスのうち、サイズのセットを選択して、21そのセット内のペアが互いに近接しないようにすることができます。

言語とライブラリ

使用可能な任意の言語とライブラリを使用できます。可能であれば、コードを実行できるとよいので、可能な限りLinuxでコードを実行/コンパイルする方法の完全な説明を含めてください。

マイマシンタイミングは64ビットマシンで実行されます。これは、8GB RAM、AMD FX-8350 8コアプロセッサ、およびRadeon HD 4250を備えた標準のUbuntuインストールです。これは、コードを実行できる必要があることも意味します。

一流の答え

  • Christian Sieversによる2、5、21、83、361のスコア4C ++
  • fəˈnɛtɪkによる2、5、21、83、372のスコア5Javascript

あなたの質問を見た後、ハッカーランクで修正されたスパイとのいくつかの類似性を示します。これはNP完全な問題です
-fəˈnɛtɪk

@ fəˈnɛtɪk素晴らしい!私の質問は、良いスコアを得るための最適なソリューションを必要としないことに注意してください。

@ fəˈnɛtɪk質問の1,2,3の回答も確認できますか?

@ fəˈnɛtɪk私はそれがNP-hardであることに疑いを持っています。Set Packingまたは別のNP完全問題を、問題サイズの多項式の変更のみで単一の整数にエンコードする必要があります。

4個の297個のユニークなハミング配列5個の2040個のユニークな配列
fəˈnɛtɪk

回答:


5

igraphライブラリを使用したC ++

新しいライブラリを学ぶ良い機会をありがとう!

このプログラムは今計算します 2, 5, 21, 83, 361高速にます。PRINTNODES定数を使用してノードの印刷を制御できます。

使用されるグラフには、一方が反対に近い(ただし等しくない)距離ベクトルに対応するノード間に余分なエッジがあります。これにより計算が高速化され、検出された独立セットももちろん元のグラフの1つになります。また、完全に強制されていない場合でも、計算された独立セットは復帰時に閉じられます。私は、常にその特性を持つ最大の独立したセットが存在すると信じています。少なくとも1つありn<=4ます。(83が最適であることを示すことができると確信しています。)

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<igraph.h>

using vect = std::vector<int>;

constexpr int MAXDIRECT=100;
constexpr int PRINTNODES=1;

std::set<int> avoid{};
igraph_t graph;
std::vector<vect> distance_vectors{};
int count;

int close_h(const vect &a, const vect &b ){
  // check one direction of the closeness condition
  for(auto i=a.begin(), j=b.begin(); i!=a.end(); i++,j++)
    if ( (*i > *j) || (*j > 2 * *i))
      return 0;
  return 1;
}

int close(const vect &a, const vect &b ){
  return close_h(a,b) || close_h(b,a);
}

vect distances(int n, int p, int t){
  vect res{};
  for (int i=0; i<n; ++i){
    int count = 0;
    for (int j=0; j<n; ++j)
      count += 1 & ((p>>j)^(t>>j));
    res.push_back(count);
    t >>= 1;
  }
  return res;
}

void print_vect( vect &v ){
  std::cout << "(";
  auto i=v.begin();
  std::cout << *i++;
  for( ; i!=v.end(); ++i)
    std::cout << "," << *i ;
  std::cout << ")\n";
}

void use_node( int n ){
  if(PRINTNODES)
    print_vect( distance_vectors[n] );
  ++count;
  avoid.insert( n );
  igraph_vector_t neighs;
  igraph_vector_init( &neighs, 0 );
  igraph_neighbors( &graph , &neighs, n, IGRAPH_OUT );
  for(int i=0; i<igraph_vector_size( &neighs ); ++i)
    avoid.insert( VECTOR(neighs)[i] );
  igraph_vector_destroy( &neighs );
}

void construct(int n){
  std::set<vect> dist_vects;
  for(int p=0; p>>n == 0; ++p)
    for(int t=0; t>>(2*n-2) == 0; ++t)   // sic! (because 0/1-symmetry)
      dist_vects.insert(distances(n,p,t));
  int nodes = dist_vects.size();
  std::cout << "distinct distance vectors: " << nodes << "\n";

  distance_vectors.clear();
  distance_vectors.reserve(nodes);
  std::copy(dist_vects.begin(), dist_vects.end(),
            back_inserter(distance_vectors));

  igraph_vector_t edges;
  igraph_vector_init( &edges, 0 );
  igraph_vector_t reversed;
  igraph_vector_init_seq( &reversed, 0, nodes-1 );
  for (int i=0; i<nodes-1; ++i){
    vect &x = distance_vectors[i];
    vect xr ( x.rbegin(), x.rend() );
    for(int j=i+1; j<nodes; ++j){
      vect &y = distance_vectors[j];
      if( xr==y ){
        VECTOR(reversed)[i] = j;
        VECTOR(reversed)[j] = i;
      }else if( close( x, y ) || close( xr, y) ){
        igraph_vector_push_back(&edges,i);
        igraph_vector_push_back(&edges,j);
      }
    }
  }
  std::cout << "edges: " << igraph_vector_size(&edges)/2 << "\n";

  igraph_create( &graph, &edges, nodes, IGRAPH_UNDIRECTED);
  igraph_vector_destroy( &edges );

  igraph_cattribute_VAN_setv( &graph, "r", &reversed );
  igraph_vector_destroy( &reversed );

  igraph_vector_t names;
  igraph_vector_init_seq( &names, 0, nodes-1 );
  igraph_cattribute_VAN_setv( &graph, "n", &names );
  igraph_vector_destroy( &names );

}

void max_independent( igraph_t *g ){
  igraph_vector_ptr_t livs;
  igraph_vector_ptr_init( &livs , 0 );
  igraph_largest_independent_vertex_sets( g, &livs );

  igraph_vector_t *nodes = (igraph_vector_t *) VECTOR(livs)[0];
  igraph_vector_t names;
  igraph_vector_init( &names, 0 );
  igraph_cattribute_VANV( g, "n", igraph_vss_vector( nodes ), &names );

  for(int i=0; i<igraph_vector_size(&names); ++i)
    use_node( VECTOR(names)[i] );
  igraph_vector_destroy( &names );
  igraph_vector_ptr_destroy_all( &livs );
}

void independent_comp( igraph_t *g );

void independent( igraph_t *g ){
  if(igraph_vcount( g ) < MAXDIRECT){
    max_independent( g );
    return;
  }
  igraph_vector_ptr_t components;
  igraph_vector_ptr_init( &components, 0 );
  igraph_decompose( g, &components, IGRAPH_WEAK, -1, 1);
  for(int i=0; i<igraph_vector_ptr_size( &components ); ++i)
    independent_comp( (igraph_t *) VECTOR(components)[i] );
  igraph_decompose_destroy( &components );
}

void independent_comp( igraph_t *g ){
  if (igraph_vcount( g ) < MAXDIRECT){
    max_independent( g );
    return;
  }
  igraph_vector_t degs;
  igraph_vector_init( &degs, 0 );
  igraph_degree( g, &degs, igraph_vss_all(), IGRAPH_OUT, 1 );
  int maxpos = igraph_vector_which_max( &degs );
  igraph_vector_destroy( &degs );  

  int name = igraph_cattribute_VAN( g, "n", maxpos );
  int revname = igraph_cattribute_VAN( g, "r", maxpos );
  int rev = -1;
  if(name!=revname){
    igraph_vector_ptr_t reversed_candidates_singleton;
    igraph_vector_ptr_init( &reversed_candidates_singleton, 0 );
    igraph_neighborhood( g, &reversed_candidates_singleton,
                         igraph_vss_1(maxpos), 2, IGRAPH_OUT );
    igraph_vector_t * reversed_candidates =
      (igraph_vector_t *) VECTOR(reversed_candidates_singleton)[0];
    igraph_vector_t names;
    igraph_vector_init( &names, 0 );
    igraph_cattribute_VANV( g, "n", igraph_vss_vector( reversed_candidates ),
                        &names );
    long int pos;
    igraph_vector_search( &names, 0, revname, &pos );
    rev = VECTOR(*reversed_candidates)[pos];
    igraph_vector_destroy( &names );
    igraph_vector_ptr_destroy( &reversed_candidates_singleton );
  }
  igraph_vs_t delnodes;
  igraph_vs_vector_small( &delnodes, maxpos, rev, -1 );
  igraph_delete_vertices( g, delnodes );
  igraph_vs_destroy( &delnodes );

  independent( g );
}

void handle(int n){
  std::cout << "n=" << n << "\n";
  avoid.clear();
  count = 0;
  construct( n );
  independent( &graph );
  // try all nodes again:
  for(int node=0; node<igraph_vcount( &graph ); ++node)
    if(avoid.count(node)==0)
      use_node(node);
  std::cout << "result: " << count << "\n\n";
  igraph_destroy( &graph );
}

int main(){
  igraph_i_set_attribute_table( &igraph_cattribute_table );
  for(int i=1; i<6; ++i)
    handle(i);
}

debianでコンパイルするには、インストールします libigraph0-devして実行します g++ -std=c++11 -Wall -O3 -I/usr/include/igraph -o ig ig.cpp -ligraph

古い説明:

igraphライブラリには、グラフの独立した頂点セットの最大サイズを計算する機能があります。この問題を処理できます n=3は1秒未満で、数日で終了しませんn=4

だから私はグラフを接続されたコンポーネントに分解し、ライブラリに小さな( MAXDIRECTノード)コンポーネントをます。他のコンポーネントについては、頂点を選択して削除します。最良の場合、これはグラフをいくつかのコンポーネントに分割しますが、通常は分割しません。とにかく、コンポーネント(たぶん1つだけ)は小さく、再帰を使用できます。

明らかに、頂点の選択が重要です。私は最高の学位を取得します。n=4逆ノードリストを使用すると、より良い結果が得られることがわかりました(ただし、のみ)。それはconstruct関数の魔法の部分を説明してい ます。

選択を改善しながら価値があるかもしれません。ただし、削除されたノードを再検討することがより重要であると思われます。今、二度とそれらを見ることはありません。それらの一部は、選択したノードのいずれにも接続されていない可能性があります。問題は、どのノードが独立セットを形成するかわからないことです。たとえば、ノードを削除すると、残りのノードの番号が変更されます。それは、属性を添付することで処理できます。しかし、さらに悪いことに、独立数の計算はこの数を与えるだけです。ライブラリが提供する最良の選択肢は、すべての最大の独立セットを計算することです。それでも、これはすぐに行く方法のようです。さらに漠然として、グラフを定義する特別な方法を使用できるかどうかを検討することも役立つと思います。

ケース n=6残りのコンポーネントのキューを使用するループで再帰を置き換えると、が到達可能になる可能性があります(必ずしも5分ではありません)。

グラフのコンポーネントを見ると面白いと思いました。の場合n=4、サイズは 168, 2*29, 2*28, 3, 4*2, 4*1です。最大のものだけを直接処理することはできません。

以下のためn=5、サイズは、 1376, 2*128, 2*120, 119, several <=6です。

私はそれらのダブルサイズが同型グラフに対応することを期待していますが、これを使用する価値はありません。

の場合n=6、最大のコンポーネントには11941(合計から15425)ノードが含まれ、次の2つの最大のコンポーネントにはサイズがあります596ます。

のためにn=7、これらの数字は107593 (125232), 2647です。


P:あなたは私のセットは83のために、私は私のアルゴリズムは4のために、高を取得しない理由を知りたい何とか5のため高くなるが何であるかを知っているようでした
fənɛtɪk

それに違いないg++ -std=c++11 -Wall -O3 -I/usr/include/igraph -o sievers sievers.cpp -ligraph。どこにあるか-ligraphが重要です。

@ChristianSieversエッジの生成はコードでどのように機能しますか?
fəˈnɛtɪk

@ChristianSievers各頂点の接続先をどのように決定するのか疑問に思っていました。配列を逆にすることは、それを台無しにするかもしれません。
fəˈnɛtɪk

@ fəˈnɛtɪk距離ベクトルは、set重複を避けるために使用しているものからソートされているように見えますが、そのコードを書いたとき、それらの順序についても考えませんでした。で始まる内側のループi+1は、ペアとその不要なスワップバージョンを見ることを避けるだけで、ループ(エッジ(a,a))を回避する最も簡単な方法です。それはノードが来る順番に依存しません。私が取得する(a,b)かどうかは気にしません(b,a)
クリスチャンシーバーズ

3

Javascriptを、配列:2,5,21、81 83372 67349

検索の開始時に要素のランダムな削除を使用して、4の値を増やすことができました。奇妙なことに、6個を超える接続を持つ20個の要素を削除する方が、8個を超える接続を持つ5個の要素を削除するよりも高速でした...

このシーケンスは、おそらく5には最適ではなく、4には最適ではない可能性があります。ただし、セット内のノードはどれも近くにありません。

コード:

input=4;
maxConnections=6;
numRand=20;

hammings=[];
h=(x,y)=>{retVal=0;while(x||y){if(x%2!=y%2)retVal++;x>>=1;y>>=1}return retVal};
for(i=1<<(input-1);i<1<<input;i++){
  for(j=0;j<1<<(2*input);j++){
    hamming=[];
    for(k=0;k<input;k++){
      hamming.push(h((j>>k)%(1<<input),i));
    }
    equal=0;
    for(k=0;k<hammings.length;k++){
      if(hamming.join("")==hammings[k].join("")){
        equal=1;
        break;
      }
    }
    if(!equal)hammings.push(hamming);
  }
}
adjMat=[];
for(i=0;i<Math.pow(input+1,input);i++){
  row=[];
  for(j=0;j<Math.pow(input+1,input);j++){
    row.push(0);
  }
  adjMat.push(row);
}
nodes=[]
for(i=0;i<Math.pow(input+1,input);i++){
  nodes[i]=0;
}
for(i=0;i<hammings.length;i++){
  sum=0;
  chkNodes=[[]];
  for(j=0;j<input;j++){
    chkVal=[];
    t=Math.pow(input+1,j);
    sum+=t*hammings[i][j];
    tmp=[];
    for(r=0;r<chkNodes.length;r++){
      for(k=hammings[i][j];k<=Math.min(hammings[i][j]*2,input);k++){
        stor=[]
        for(s=0;s<chkNodes[r].length;s++){
          stor.push(chkNodes[r][s])
        }
        stor.push(k)
        tmp.push(stor);
      }
    }
    chkNodes=[];
    for(r=0;r<tmp.length;r++){
      chkNodes.push(tmp[r])
    }
  }
  nodes[sum]=1;
  for(j=0;j<chkNodes.length;j++){
    adjSum=0
    for(k=0;k<input;k++){
      adjSum+=Math.pow(input+1,k)*chkNodes[j][k]
    }
    if(adjSum!=sum)adjMat[sum][adjSum]=adjMat[adjSum][sum]=1
  }
}
t=nodes.length;
for(i=0;i<t;i++){
  if(!nodes[i]){
    for(k=0;k<t;k++){
      adjMat[i][k]=adjMat[k][i]=0
    }
  }
}
sum=(a,b)=>a+b;
console.log(nodes.reduce(sum))
connections=x=>x.reduce(sum)
counts=adjMat.map(connections);
stor=[];
for(i=0;i<t;i++){
  stor.push(nodes[i]);
}
maxRemainder=0;

greater=[]
for(i=0;i<t;i++){
  if(nodes[i]&&counts[i]>maxConnections){
    greater.push(i);
  }
}

if(input==4){
  for(w=0;w<greater.length*numRand;w++){
    for(i=0;i<t;i++){
      nodes[i]=stor[i];
    }
    counts=adjMat.map(connections);
    toRemove=Math.floor(Math.random()*numRand*2)
    for(i=0;i<toRemove&&i<greater.length;i++){
      rand=Math.floor(Math.random()*greater.length);
      if(nodes[greater[rand]]){
        nodes[greater[rand]]=0;
        for(j=0;j<t;j++){
          if(adjMat[rand][j]){
            counts[j]--;
          }
        }
      }
    }

    for(i=0;i<t*t;i++){
      max=0;
      maxLoc=0;
      for(j=0;j<t;j++){
        if(counts[j]>=max&&nodes[j]){
          max=counts[j];
          maxLoc=j;
        }
      }
      if(max>0){
        for(j=0;j<t;j++){
          if(adjMat[maxLoc][j]){
            counts[j]--;
            if(counts[j]<max-1&&stor[j]&&!nodes[j]){
              nodes[j]=1;
              for(k=0;k<t;k++){
                if(adjMat[j][k])counts[k]++;
              }
            }
          }
          nodes[maxLoc]=0;
        }
      }
      else{
        break;
      }
    }
    maxRemainder=Math.max(maxRemainder,nodes.reduce(sum))
    //console.log(nodes.reduce(sum));
  }
  console.log(maxRemainder);
}
else{
  for(i=0;i<t*t;i++){
    max=0;
    maxLoc=0;
    for(j=0;j<t;j++){
      if(counts[j]>=max&&nodes[j]){
        max=counts[j];
        maxLoc=j;
      }
    }
    if(max>0){
      for(j=0;j<t;j++){
        if(adjMat[maxLoc][j]){
          counts[j]--;
          if(counts[j]<max-1&&stor[j]&&!nodes[j]){
            nodes[j]=1;
            for(k=0;k<t;k++){
              if(adjMat[j][k])counts[k]++;
            }
          }
        }
        nodes[maxLoc]=0;
      }
    }
    else{
      break;
    }
  }
  console.log(nodes.reduce(sum));
}

オンラインでお試しください!

プログラムの最後に追加できるスニペットで、選択した各ハミング距離シーケンスを表示します

for(i=0;i<t;i++){
  if(nodes[i]){
    tmp=[]
    for(j=0;j<input;j++){
      tmp.unshift(Math.floor(i/Math.pow(input+1,j))%(input+1))
    }
    console.log(tmp.join(""))
    output=""
    for(j=0;j<t;j++){
      if(adjMat[i][j]&&stor[j]){
        outArr=[]
        for(k=0;k<input;k++){
          outArr.unshift(Math.floor(j/Math.pow(input+1,k))%(input+1))
        }
        output+=" "+outArr.join("");
      }
    }
    console.log(output)
  }
}

説明:

最初に、コードは部分文字列からすべての一意のハミング距離を生成します。

input=3;
hammings=[];
h=(x,y)=>{retVal=0;while(x||y){if(x%2!=y%2)retVal++;x>>=1;y>>=1}return retVal};
for(i=1<<(input-1);i<1<<input;i++){
  for(j=0;j<1<<(2*input);j++){
    hamming=[];
    for(k=0;k<input;k++){
      hamming.push(h((j>>k)%(1<<input),i));
    }
    equal=0;
    for(k=0;k<hammings.length;k++){
      if(hamming.join("")==hammings[k].join("")){
        equal=1;
        break;
      }
    }
    if(!equal)hammings.push(hamming);
  }
}

次に、コードはこのリストを無向グラフに変換します

adjMat=[];
for(i=0;i<Math.pow(input+1,input);i++){
  row=[];
  for(j=0;j<Math.pow(input+1,input);j++){
    row.push(0);
  }
  adjMat.push(row);
}
nodes=[]
for(i=0;i<Math.pow(input+1,input);i++){
  nodes[i]=0;
}
for(i=0;i<hammings.length;i++){
  sum=0;
  chkNodes=[[]];
  for(j=0;j<input;j++){
    chkVal=[];
    t=Math.pow(input+1,j);
    sum+=t*hammings[i][j];
    tmp=[];
    for(r=0;r<chkNodes.length;r++){
      for(k=hammings[i][j];k<=Math.min(hammings[i][j]*2,input);k++){
        stor=[]
        for(s=0;s<chkNodes[r].length;s++){
          stor.push(chkNodes[r][s])
        }
        stor.push(k)
        tmp.push(stor);
      }
    }
    chkNodes=[];
    for(r=0;r<tmp.length;r++){
      chkNodes.push(tmp[r])
    }
  }
  nodes[sum]=1;
  for(j=0;j<chkNodes.length;j++){
    adjSum=0
    for(k=0;k<input;k++){
      adjSum+=Math.pow(input+1,k)*chkNodes[j][k]
    }
    if(adjSum!=sum)adjMat[sum][adjSum]=adjMat[adjSum][sum]=1
  }
}

最後に、コードはこのグラフを巡回し、現在の最大値よりも少ない接続を持つノードを復元する前に、各サイクルで最も接続の多い頂点を削除します。このサイクルが終了すると、残りのノードの数を出力します

t=nodes.length;
for(i=0;i<t;i++){
  if(!nodes[i]){
    for(k=0;k<t;k++){
      adjMat[i][k]=adjMat[k][i]=0
    }
  }
}
sum=(a,b)=>a+b;
counts=adjMat.map(x=>x.reduce(sum));
stor=[];
for(i=0;i<t;i++){
  stor.push(nodes[i]);
}
for(i=0;i<t*t;i++){
  max=0;
  maxLoc=0;
  for(j=0;j<t;j++){
    if(counts[j]>=max&&nodes[j]){
      max=counts[j];
      maxLoc=j;
    }
  }
  if(max>0){
    for(j=0;j<t;j++){
      if(adjMat[maxLoc][j]){
        counts[j]--;
        if(counts[j]<max-1&&stor[j]&&!nodes[j]){
          nodes[j]=1;
          for(k=0;k<t;k++){
            if(adjMat[j][k])counts[k]++;
          }
        }
      }
      nodes[maxLoc]=0;
    }
  }
  else{
    break;
  }
}
console.log(nodes.reduce(sum));

セット:

1:

0 1

2:

00 01 10 12 21

3:

000 001 011 013 030 031 100 101 110 111 123 130 132 203 213 231 302 310 312 
321 333

4:

0000 0001 0011 0111 0124 0133 0223 0230 0232 0241 0313 0320 0322 0331 0403 
0412 1000 1001 1013 1021 1100 1102 1110 1111 1134 1201 1224 1233 1243 1304 
1314 1323 1330 1332 1342 1403 1413 1420 1422 2011 2033 2124 2133 2140 2142 
2214 2230 2241 2303 2313 2320 2331 2411 3023 3032 3040 3041 3101 3114 3123 
3130 3132 3141 3203 3213 3220 3231 3302 3310 3312 3321 3334 3343 3433 4031 
4113 4122 4131 4210 4212 4221 4311 4333

5:

00000 00001 00011 00111 00123 01112 01235 01244 01324 01343 02111 02230 
02234 02333 02342 02432 02441 02522 02530 02531 03134 03142 03220 03224 
03233 03241 03314 03323 03331 03403 03412 03421 03520 04133 04141 04214 
04223 04232 04303 04313 04322 05042 05050 05051 05132 10000 10001 10011 
10122 10212 10221 10245 11000 11001 11013 11022 11100 11112 11120 11121 
11202 11211 11345 11353 11443 12012 12111 12201 12245 12253 12335 12344 
12352 12425 12430 12434 12442 12513 12532 13033 13042 13244 13252 13325 
13330 13334 13342 13404 13424 13433 13441 13520 13522 13531 14032 14051 
14140 14152 14225 14230 14234 14241 14243 14304 14315 14324 14332 14413 
14420 14422 14431 15041 15050 15125 15133 15142 15215 15223 15232 20112 
20135 20211 20253 20334 20352 21012 21021 21102 21110 21111 21201 21245 
21344 21352 21430 21433 21442 21514 21523 22011 22101 22135 22244 22252 
22325 22334 22340 22343 22405 22415 22424 22441 22520 22522 22531 23041 
23144 23150 23152 23225 23234 23240 23243 23251 23304 23315 23324 23333 
23341 23403 23413 23420 23432 23521 24031 24050 24125 24130 24134 24142 
24151 24215 24224 24233 24303 24314 24320 24323 24331 24412 24421 25123 
25132 25141 25203 25214 25222 25231 25302 25312 25321 30234 30243 30252 
30324 30333 30340 30342 30414 30423 30430 30432 31011 31235 31244 31253 
31325 31334 31340 31343 31405 31415 31424 31432 31441 31504 31521 32025 
32034 32100 32144 32152 32225 32234 32240 32243 32251 32304 32315 32324 
32330 32333 32342 32403 32414 32423 32512 33024 33031 33033 33125 33134 
33140 33143 33151 33215 33224 33230 33233 33242 33303 33314 33320 33323 
33332 33412 33431 34124 34133 34203 34214 34223 34232 34241 34310 34313 
34322 34411 35202 35213 35221 35311 40323 40332 40341 40431 40505 40513 
41135 41144 41240 41243 41252 41324 41330 41333 41342 41403 41414 41423 
41512 42033 42134 42143 42230 42233 42242 42303 42310 42314 42323 42332 
42341 42413 42422 42431 43023 43124 43130 43133 43142 43203 43220 43223 
43232 43241 43302 43313 43322 43331 43421 44114 44123 44132 44210 44213 
44222 44231 44312 44321 50413 50422 50504 51233 51242 51251 51323 51332 
51341 51413 51422 52023 52133 52142 52151 52223 52232 52241 52313 52322 
52331 52421 53102 53114 53122 53210 53213 53321 54201 54212 54221 54311

最初の答えをくれてありがとう!Linuxでコードを実行する方法について、馬鹿のためのステップバイステップガイドを教えてください。

おそらくfəˈnɛtkは自分のコードをスタックスニペットに変えることができますか?
mbomb007

@ mbomb007何らかの理由で、これをスニペットにすると、エラー0は関数ではありません... for(j = 0; j <t; j ++)
fəˈnɛtɪk

たぶん、JSFiddleを試すことができますか?
mbomb007

クロムをお持ちの場合は、コードをコピーしてコンソールに貼り付け、Enterキーを押して実行できます。他のブラウザについては完全にはわかりません。Chromeは、オンラインシステムよりもコードを高速に実行します。349の5番目の値を取得するために管理
fənɛtɪk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.