ホームページ  >  記事  >  バックエンド開発  >  ファイル システムの階層を表すパス文字列の配列からツリー状の構造を効率的に構築するにはどうすればよいでしょうか?

ファイル システムの階層を表すパス文字列の配列からツリー状の構造を効率的に構築するにはどうすればよいでしょうか?

DDD
DDDオリジナル
2024-10-27 00:40:02775ブラウズ

How to efficiently construct a tree-like structure from an array of path strings representing a file system hierarchy?

パス文字列配列からツリー状構造を構築する方法

概要:
ファイル パスを表す文字列の配列を使用して、ディレクトリ階層を反映するツリー状のデータ構造を構築することを目指します。配列内の各文字列は、ルート ディレクトリから特定のファイルまたはディレクトリへの完全なパスを表します。

子リストを使用した再帰的アプローチ:
ツリーを再帰的に構築するには、以下を行う必要があります。パス文字列を左から右にたどり、コンポーネントに分割します。名前を持つ Node 構造体と子ノードのスライスを使用してツリーを表すことができます。

<code class="go">type Node struct {
    Name     string
    Children []Node
}</code>

重要な洞察は、単一ノードの子ではなくノードのリストを操作することです。これにより、異なるルート ノードを持つ複数のツリーを処理できるようになります。

<code class="go">func AddToTree(root []Node, names []string) []Node {
    if len(names) > 0 {
        var i int
        for i = 0; i < len(root); i++ {
            if root[i].Name == names[0] { //already in tree
                break
            }
        }
        if i == len(root) {
            root = append(root, Node{Name: names[0]})
        }
        root[i].Children = AddToTree(root[i].Children, names[1:])
    }
    return root
}</code>
  1. 最初のコンポーネント (names[0]) が現在のノード リスト (ルート) に存在するかどうかを確認します。
  2. そうでない場合は、この名前のノードをリストに追加します。
  3. 更新されたリストで AddToTree を再帰的に呼び出し、パスの残りのコンポーネントを渡します。

例:
入力パス文字列の場合:

<code class="go">s := [...]string{"a/b/c", "a/b/g", "a/d"}</code>

関数 AddToTree は次のツリー構造を生成します:

<code class="json">{
 "name": "a",
 "children": [
     {
      "name": "b",
      "children": [
        {
         "name": "c"
        },
        {
         "name": "g"
        }
      ]
    },
    {
     "name": "d",
     "children": []
    }
  ]
}</code>

元のアプローチと比べた利点:

  1. ノードのリストを操作し、異なるルート ノードを持つ複数のツリーを許可します。
  2. 入力ノードを再利用する代わりに新しいノードを作成し、ツリーの各レベルが確実に
  3. ノードの重複を防ぐためにツリーを検索します。

以上がファイル システムの階層を表すパス文字列の配列からツリー状の構造を効率的に構築するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。