データの「ソート解除」/同質性アルゴリズム


8

車輪を再発明しないように、私は誰かがデータ同質性アルゴリズムについてアイデアを持っているかどうか尋ねています。簡単な例:

私のデータにはいくつかの要素があります

  1. フルーツ
  2. 文字

配列にはこれらの要素が約100あります。アルゴリズムは、同じ番号の2つのエントリが互いにできるだけ間隔をあけて、色や果物などが同じになるように要素を並べ替える必要があります。要素に優先順位を付けることができれば、さらに良いでしょう。100%に到達することはないように思えるので、作成するパスの数を指定し、結果を確認してから、より多くのパスを試します。

私が見つけることができる十分なgoogle-fuを持っていないだけで機能する何かがここにあるとしても、私は驚かないでしょう。


遺伝子検索のようなことを試しましたか?
デビッドワイザー2011

3
あなたは英語のネイティブスピーカーのように書くので、少し書き上げてください。属していない単語「like」を削除して、一般的な文章に磨きをかけてください。また、例を提供することに注意してください。私はあなたの質問を完全に理解していません。
ジョブ

3
例は不可欠です。ユニットテストケースは、この種のものにとって重要です。テキストの段落はテストケースではありません。
S.Lott、2009

回答:


2

こういうのはしばらく私を悩ませたので、それが解決するかどうか見に行かなければなりませんでした。これが私の考えです。最初から、私が知っているアルゴリズムのアプリケーションではありません。これはかなり高価なブルートフォースアルゴリズムになりますが、かなり効果的です。これは、あなたが記述した現実的に小さなデータセット(4行100列)を処理し、十分なRAMを備えた最新のコンピューターで作業していることを前提としています。

概要:並べ替えられたリストで再帰アルゴリズムを使用して、類似レコードを類似レコード内の最大距離に分散します。各呼び出しの後、同じ親を持つすべてのレコードは最大距離にあります。最初の呼び出しにはすべてのレコードが含まれます。そのため、裏返しに並べ替えられます。

データ構造

  • newIndexesですarray<integer>。配列のインデックスは、行の既存のインデックスです。値は-1で始まる新しいインデックスになります
  • dataですarray<array<string>>。キーはインデックスで、内部配列は1行の値の文字列表現です。データをグループ化する方法がある場合は、文字列である必要はありません。最初の配列要素は、最大の重みを持つものです。

data重量順に並べ替えます。最初に、重みが最大の列で並べ替え、次に重みが2番目に大きい列で並べ替えます。結果は、希望とは逆になります。順次インデックスを付けます。

これは、アルゴリズム(psudoコード内)です。

        // siblingCount: On first call is the number of rows in the table,
    //    on recursive calls it is the number of elements with the same parent
    // index: the index of current row in `data` - starts 0
    // depth: The element index - starts 0
    void unsort(int siblingCount, int index, int depth)
    {
        int count = 1;
        string hash = concatColumns(index, depth + 1);
        while ((index + count < data.count) && (hash == concatColumns(index + count, depth + 1)))
        {
            count++;
        }

        if (depth < columnCount)
            unsort(count, index, depth);
        else if (index < data.count)
            unsort(count, index + count, 0);

        int spacing = siblingCount / count;

        for (int i = 0; i < count; i++)
        {
            var offset = 0;
            while ((newIndexes[index + i + offset] > -1) & (index + i + offset + 1 < newIndexes.count))
                offset++;

            if (newIndexes[index + i + offset] > -1) throw new Exception("Shouldn't happen.");

            newIndexes[index + i + offset] = index + spacing * i;
        }
    }

    string concatColumns(int index, int count) // returns count columns concatinated
    {
        // 1,1 = "1"
        // 1,2 = "1, blue"
        // 1,3 = "1, blue, apple"
        return "1, blue, apple";
    } 

次に、ソートされていないデータにnewIndexesを適用します。

アプローチについての考え:これはテストしませんでしたが、最初のインデックスは最下位の列に基づいて割り当てられるため、newIndexesの保存と競合の解決は問題になる可能性があります。最初にオフセットを正に適用してから、負に適用してみてください。または、配列の代わりにリンクリストに挿入することもできます。


ああ!ここで何をしているのかよくわかります。ソートし、同じチェーンのサイズに基づいて分離します。これでうまくいかない場合は、かなり近いはずです。あなたの助けと質問の整理をありがとう!次回、この種類のデータを9月に処理する必要があるときに、これを試すことができるといいのですが
ExoByte

仕組みを教えてください。
ジムマッキース、2011

4

これは、私が見たいくつかのネットワークアルゴリズム、キーワード「tkwikibrowser」、「TouchGraphWikiBrowser」を思い出させます。この場合、要素は一種のラバーバンドと組み合わされますが、同じpolの磁石のようなものです。

私はあなたのケースを引っ張るメカニズムが何であるかわかりませんが、おそらく「ケース」が正しいキーワードです:要素はケースに入れられ、ケースの境界から押し出され、互いに押し離されます、さらに言えば、それらに共通の複数の属性がある場合。

それらはランダムな位置から始まり、壁までの距離、および類似の要素までの距離に応じて移動し、安定した位置を検索します。

互いに押しのける式は、距離に対して線形または二次式である可能性があり、値を操作することにより、適切な式をライブで検索できます。

更新:

引き付ける力については、気を散らす力の逆を単に取ることができます。したがって、2つの要素が単一の属性を共有しない場合、これが最大の魅力になります。


はい、噛みます。tkwikibrowserでGoogle検索を行ったところ、何も見つかりませんでした。詳細情報にリンクできますか?
ジム

その通りです。申し訳ありません。名前はTKWikiではありませんでしたが、TGWiki ...はTouchGraphの場合、ここのように表示されますが、このスクリーンショットしか見つかりませんでした。 。
ユーザー不明

3

ランダムシャッフルを使用するか、連結されたデータのハッシュで並べ替えます。適切なハッシュは、類似した入力に対して非常に異なる出力を提供するため、どの次元でも類似したエントリは分離する必要があります。


1
これは最も簡単な解決策のようですが、今、これが実際のデータでどのように機能するのか本当に興味があります。
TheLQ 2011

類似のハッシュは似ていないが、同じ行のハッシュは同じハッシュを生成し、隣接するようにソートするという問題。
ジムマッキース

そして、データには正確な重複があります。これは、最初は興味深い場所かもしれません。
ExoByte 2011

@ジム・マッキース:そうです。もちろん、インデックスを連結して、他の点では同一の行を少数のビットで区別することもできます。また、近くのデータがそのまま残るように線形データを空間的に分布させるZオーダーカーブ(ビットインターリーブによって簡単に得られる)を調べることもできます。あなたはその逆を提供する順列を探しています。
Jon Purdy、2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.