bash:与えられた親 - 子セットのルートノードを効率的に見つける方法

bash:与えられた親 - 子セットのルートノードを効率的に見つける方法

私は親ID、子IDペアの巨大な(数GB)ファイルを持っています。また、既知のルートノードの(不完全な)セットがあります。

既知の子ノードごとに、既知の親と子のペアがないか、または既知のルートノードセットに属するルートノードを見つける必要があります。これらのルートノードが見つかったら、それを上のペアの3番目のフィールドとして作成する必要があります。

コマンドライン環境で最も効果的なツールと方法は何ですか?

ルートの平均ノード深さが約5-10レベルであると仮定すると、何百もの葉ノードがある場合、深さは数百レベルに達します。

MacOS(High Sierra)と一部のGnu / Linuxの間の移植性が必要です。 MacOSにGNUツールセットがあり、MacとLinuxにさらにコマンドラインツールを無料でインストールします。どちらのプラットフォームも4GBのRAM、まともな古いCPUを持っているとします。

ベストアンサー1

あなたのファイルに特定の文字で区切られた2つの列があるとします。

問題をもう少し詳しく調べると、ルートノードは決して子ノードとして表示されません。配列の親を追跡し、子の場合は数を増やします。数が0の配列キーがルートノードになります。

awk -F, '
   !($1 in p) {p[$1]=0}   # register a parent in the array
   {p[$2]++}              # increment the count when it's seen as a child
   END {for (n in p) if (p[n] == 0) print n}
' bigfile

@filbrandenが指摘したように、これはルートノードのみを探します。

職場でも同様の状況があります。 Oracleデータベースには、親項目と子項目を含む表があります。サブIDをマッピングするビューを作成します。親につながるID:

id parent_id
 1 null
 2 1
 3 2
 4 1
 5 null
 6 5

ビューは次のとおりです。

id id_path
 1 1
 2 1\2
 3 1\2\3
 4 1\4
 5 5
 6 5\6

これはPL / SQLを介して達成されます。

CREATE OR REPLACE VIEW "SCHEMA"."ITEM_PATHS" ("ID", "ID_PATH") AS
SELECT 
    pci."ID",
    substr(SYS_CONNECT_BY_PATH(pci.id, '\'), 2)  AS ID_PATH
  FROM schema.parent_child_items pci
    START WITH parent_id IS NULL
    CONNECT BY prior id = parent_id;

したがって、データベースでもこれは小さな問題ではありません。しかし、私はデータベースがより大きなデータセットをよりよく処理できると信じています。

おすすめ記事