Kaç mesafe dizisinin diğerlerinden uzak olduğunu sayın


13

Hamming mesafesi eşit uzunlukta iki sırası arasındaki karşılık gelen simgeler farklı olan pozisyonların sayısıdır.

Izin Pvermek bir ikili dize uzunluğu nve Tbir ikili dize uzunluğu 2n-1. Soldan sağa sırayla nHamming mesafelerini Pve her bir nuzunluk alt dizesini hesaplayabilir Tve bunları bir diziye (veya listeye) koyabiliriz.

Örnek Hamming mesafe sırası

Bırakın P = 101ve T = 01100. Bu çiftten aldığınız Hamming mesafelerinin sırası 2,2,1.

Closeness'un tanımı

Şimdi Hamming mesafelerinin bu iki dizisini ele alalım. Söyle x = (0, 2, 2, 3, 0)ve y = (2, 1, 4, 4, 2)örnek olarak. Biz söylemek xve yvardır closeeğer y <= x <= 2*yyoksa eğer x <= y <= 2*x. Burada skaler çarpma ve eşitsizlik eleman olarak alınır. Olduğunu iki dizileri için söylenecek Ave B, A <= B iff A[i] <= B[i]tüm endekslerin için i.

Hamming mesafelerinin sekanslarının, bu karşılaştırma şekliyle kısmi bir düzen oluşturduğuna dikkat edin. Başka bir deyişle, birçok dizi çifti ne büyük ya da eşittir ne de büyüktür ya da eşittir. Örneğin (1,2)ve (2,1).

Yani yukarıdaki örneği kullanmak, (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)ancak (0, 2, 2, 3, 0)daha büyük değildir (2, 1, 4, 4, 2). Ayrıca (2, 1, 4, 4, 2)eşit veya daha küçük değildir 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0). Sonuç olarak xve ybirbirlerine yakın değiller.

Görev

Artan İçin nbaşlayan n=1ikili dizeleri tüm olası çiftleri dikkate Puzunluğu nve Tuzunluk 2n-1. Öyle 2^(n+2n-1)çiftler var ve bu nedenle Hamming mesafelerinin birçok dizisi var. Bununla birlikte, bu dizilerin çoğu aynı olacaktır. Görev, en büyük Hamming mesafe dizisi kümesinin boyutunu bulmaktır, böylece iki dizi birbirine yakın olmaz.

Kodunuzun değeri başına bir sayı çıkmalıdır n.

Puan

Puanınız genel olarak nkodunuzun 5 dakika içinde makinemde ulaştığı en yüksek seviyeyi söylüyor (ancak okumaya devam ediyor). Zamanlama sadece çalışma süresi değil, toplam çalışma süresi içindir n.

Optimal olmayan cevaplar için puanlar vermek için, optimal cevapları bulmak zor olacağından, hafif bir puanlama sistemine ihtiyacımız olacaktır. Puanınız, nhiç kimsenin buna eşit olandan daha küçük herhangi bir boyut için daha yüksek doğru cevap göndermediği en yüksek değerdir . Örneğin, çıktı alıyorsanız 2, 4, 21ve başka biri çıktısını 2, 5, 15alırsanız, yalnızca 1başka birinin daha iyi bir cevabı olduğu için puan alırsınız n = 2. Çıktı 2, 5, 21verirseniz, 3başka kimsenin çıktısı ne olursa olsun puan alırsınız çünkü bu cevaplar en uygunudur. Açıkçası tüm optimum cevaplarınız varsa, o zaman en yüksek gönderdiğiniz puan için alacaksınız n. Ancak, cevabınız optimum olmasa bile, başka hiç kimse onu yenemezse skoru yine de alabilirsiniz.

Örnek cevaplar ve çalışılan örnek

(Bu yanıtlar henüz işaretlenmemiştir. Bağımsız doğrulama minnetle alınır.)

ETHproductions sayesinde:

  • n = 1, 2 verir.
  • n = 2, 5 verir.
  • n = 3 21 verir.

n = 2Daha ayrıntılı olarak bakalım . Bu durumda (burada tuples ile temsil edilen) Hamming mesafe dizilerinin tam listesi:

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

Bunun (0,0)başka bir gruba yakın olmadığını görebiliriz . Aldığımız Aslında (0, 0), (0, 1), (1, 0), (2, 1), (1,2)bu dizilerini hiçbiri yakın başkalarına herhangi birine bulunmaktadır. Bu 5için bir puan verir n = 2.

İçin n = 3farklı Hamming uzaklığı dizilerinin tam listesi:

 [(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)]

Bu 48dizilerden bir dizi boyut seçebiliriz, 21böylece bu setteki hiçbir çift birbirine yakın olmaz.

Diller ve kütüphaneler

İstediğiniz dil ve kitaplıkları kullanabilirsiniz. Mümkün olduğunda, kodunuzu çalıştırabilmeniz iyi olur, bu nedenle mümkünse kodunuzu Linux'ta nasıl çalıştıracağınız / derleyeceğinize ilişkin tam bir açıklama ekleyin.

Benim Makine zamanlamaları benim 64 bit makinede işletilecek. Bu, 8GB RAM, AMD FX-8350 Sekiz Çekirdekli İşlemci ve Radeon HD 4250 ile standart bir ubuntu yüklemesidir. Bu aynı zamanda kodunuzu çalıştırabilmem gerektiği anlamına gelir.

Öncü cevap

  • Christian Sievers tarafından 2, 5, 21, 83, 361 için 4 puan . C ++
  • Arasında puan 5 2, 5, 21, fənɛtɪk ile 83, 372. JavaScript

Sorunuza baktıktan sonra , NP-tam bir sorun olan hackerrank üzerinde revize edilen casuslara bazı benzerlikler gösterir
fəˈnɛtɪk

@ fəˈnɛtɪk Harika! Sorumun iyi bir puan almak için en uygun çözümleri gerektirmediğini unutmayın.

@ fəˈnɛtɪk Sorudaki 1,2,3 yanıtlarını da onaylayabilir misiniz?

@ fəˈnɛtɪk NP-zor olduğundan şüpheliyim. Set Ambalajını veya başka bir NP-tamamlanmış problemi, problem boyutunda sadece polinom değişikliği ile tek bir tamsayıya kodlamanız gerekir.

4 için
207

Yanıtlar:


5

İgraph kitaplığını kullanarak C ++

Yeni bir kütüphane öğrenmek için güzel bir fırsat için teşekkürler!

Bu program şimdi 2, 5, 21, 83, 361hızlı hesaplıyor . PRINTNODESSabit ile düğümlerin yazdırılmasını kontrol edebilirsiniz .

Kullanılan grafik, birinin diğerine ters olduğu (fakat aynı olmadığı) mesafe vektörlerine karşılık gelen düğümler arasında ekstra kenarlara sahiptir. Bu, hesaplamayı hızlandırır ve bulunan herhangi bir bağımsız set elbette orijinal grafikten biridir. Ayrıca, tamamen uygulanmasa bile, hesaplanan bağımsız küme reversiyon altında kapatılır. Ben her zaman bu özelliği ile bir maksimum bağımsız kümesi var inanıyorum. En azından bir tane var n<=4. (Eminim 83 en uygun olduğunu gösterebilirim.)

#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'de derlemek için yükleyin libigraph0-devve yapın g++ -std=c++11 -Wall -O3 -I/usr/include/igraph -o ig ig.cpp -ligraph.

Eski açıklama:

Igraph kütüphanesi, bir grafiğin bağımsız tepe noktasının maksimum boyutunu hesaplama fonksiyonuna sahiptir. Bu sorunu n=3bir saniyeden daha kısa sürede halledebilir ve günler içinde sona ermez n=4.

Yaptığım şey grafiği bağlı bileşenlere ayırmak ve kütüphanenin küçük ( MAXDIRECTdüğümlerden daha az ) bileşenleri işlemesine izin vermektir . Diğer bileşenler için bir tepe noktası seçip silerim. En iyi durumda, bu grafik birkaç bileşene ayrılır, ancak genellikle değildir. Her neyse, bileşenler (belki sadece bir tane) daha küçüktür ve özyineleme kullanabiliriz.

Açıkça, tepe noktasının seçimi önemlidir. Sadece maksimum dereceden birini alıyorum. n=4Ters bir düğüm listesi kullandığımda (ancak yalnızca ) daha iyi sonuç elde ettim. Bu, constructişlevin sihirli kısmını açıklar .

Seçimi geliştirirken faydalı olabilir. Ancak silinen düğümleri yeniden gözden geçirmek daha önemli görünüyor. Şimdi, bir daha asla onlara bakmam. Bazıları seçilen düğümlerden herhangi birine bağlı olmayabilir. Sorun şu ki, hangi seti bağımsız bir set oluşturduğunu bilmiyorum. Birincisi, düğümlerin silinmesi kalan düğümleri yeniden sıralar. Bu, onlara nitelikler ekleyerek halledilebilir. Daha da kötüsü, bağımsızlık sayısının hesaplanması sadece bu sayıyı verir. Kütüphanenin sunduğu en iyi alternatif, en yavaş bağımsız tüm kümeleri hesaplamaktır , ki bu daha yavaştır (grafik boyutuna ne kadar bağlı olduğu görülmektedir). Yine de, bu hemen gitmenin yolu gibi görünüyor. Çok daha belirsiz bir şekilde, grafiğin tanımlandığı özel yolu kullanıp kullanamayacağımızı düşünmenin de yararlı olabileceğini düşünüyorum.

n=6Özyinelemeyi kalan bileşenler için bir kuyruk kullanarak bir döngü ile değiştirirsem davaya ulaşılabilir (5 dakika içinde olması gerekmez).

Grafiklerin bileşenlerine bakmayı ilginç buldum. Çünkü n=4boyutları 168, 2*29, 2*28, 3, 4*2, 4*1. Sadece en büyüğü doğrudan ele alınamaz.

Için n=5, boyutları vardır 1376, 2*128, 2*120, 119, several <=6.

Bu çift boyutların izomorfik grafiklere karşılık gelmesini bekliyorum, ancak her zaman tek bir hakim en büyük bileşen olduğu için bunu kullanmak değmez:

Çünkü n=6, en büyük bileşen 11941(toplamdan 15425) düğümler içerir , sonraki iki büyük bileşenin boyutu vardır 596.

Çünkü n=7bu sayılar 107593 (125232), 2647.


Setin 83 için ne olduğunu bana bildirir misiniz, algoritmamın neden 4 için bu kadar yükselmediğini bilmek istiyorum ama bir şekilde 5 için daha yüksek oluyor: P
fəˈnɛtɪk

Olmak zorunda g++ -std=c++11 -Wall -O3 -I/usr/include/igraph -o sievers sievers.cpp -ligraph. Nerede -ligrapholduğu önemli .

@ChristianSievers Kodda kenar üretimi nasıl çalışır?
fəˈnɛtɪk

@ChristianSievers Her bir tepe noktasının neye bağlanması gerektiğini nasıl belirlediğini merak ediyordum. Diziyi tersine çevirmek bunu bozuyor olabilir.
fəˈnɛtɪk

@ fəˈnɛtɪk Uzaklık vektörleri setyinelenenleri önlemek için kullandığım sıraya dizilmiş gibi görünüyor , ama bu kodu yazarken sıralarını düşünmedim bile. İçten başlayan iç halka i+1, bir çifte ve ayrıca ihtiyaç duyulmayan değiştirilmiş versiyonuna bakmaktan kaçınır ve döngülerden (kenarlardan (a,a)) kaçınmanın en kolay yoludur . Bu düğümler ben alırsam umrumda değil, gel sıraya bağlı değildir (a,b)ya (b,a).
Christian Sievers

3

Javascript, Sıra: 2,5,21, 81 83.372 67.349

Arama başlangıcında öğelerin rastgele kaldırılmasını kullanarak 4 değerini artırmayı başardı. İşin garibi, 6'dan fazla bağlantısı olan 20 öğeyi kaldırmak, 8'den fazla bağlantısı olan 5 öğeyi kaldırmaktan daha hızlıydı ...

Bu sekans muhtemelen 5 için optimal değildir ve 4 için optimal olmayabilir. Bununla birlikte, hiçbir düğüm kümede diğerine yakın değildir.

Kod:

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));
}

Çevrimiçi deneyin!

Her bir Hamming mesafesi sekansının seçili Hamming mesafesi sekanslarını göstermek için programın sonuna eklenebilecek snippet

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)
  }
}

Açıklama:

İlk olarak, kod alt dizelerden tüm benzersiz çekiçleme mesafelerini üretir.

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);
  }
}

Ardından, kod bu listeyi yönlendirilmemiş bir grafiğe dönüştürür

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
  }
}

Son olarak, kod bu grafikte dolaşarak, şimdiki maksimumdan daha az bağlantıya sahip olacak düğümleri geri yüklemeden önce her döngüde en çok bağlantı içeren tepe noktasını kaldırır. Bu döngü ile işiniz bittiğinde, kalan düğümlerin sayısını verir

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));

Setler:

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

İlk cevabı verdiğin için teşekkürler! Linux'ta kodunuzu nasıl çalıştıracağınız konusunda aptallar için adım adım bir rehber verebilir misiniz?

Belki fəˈnɛtɪk kodunu bir yığın snippet'e dönüştürebilir?
mbomb007

@ mbomb007 herhangi bir nedenle, bunu bir pasaja dönüştürmek 0 hatasının bir işlev olmamasına neden olur ... (j = 0; j <t; j ++)
fəˈnɛtɪk 16:17

Belki JSFiddle'ı deneyebilirsin?
mbomb007

Kromunuz varsa kodu kopyalayıp konsola yapıştırabilir ve enter tuşuna basarak çalıştırabilirsiniz. Diğer tarayıcılardan tam olarak emin değilim. Chrome kodu benim için çevrimiçi sistemlerden daha hızlı çalıştırıyor. 349
5
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.