【问题标题】:Trie with custom insert and delete functions尝试自定义插入和删除功能
【发布时间】:2018-02-10 21:42:51
【问题描述】:

我需要在不改变其 O(n) 复杂度的情况下为 Trie 数据结构创建四个自定义函数:

  • makeDir("pathToDir")
  • make("pathToFile")
  • delete("pathToDir")
  • forceDelete("pathToDirOrFile")

makeDir("pathToDir"):仅当路径是有效路径时才将路径添加到特里树

make("pathToFile"): 仅当路径是有效路径时才添加路径(文件节点不能调用 makeDir())

delete("pathToDir"):仅当路径没有子目录时才从 trie 中删除路径

forceDelete("pathToDirOrFile"):删除路径及其子目录

例如,命令列表是:

makeDir("\dir");
makeDir("\dir\foo")
makeDir("\dir\foo\lol\ok"); /* incorrect path */
make("\dir\file");
makeDir("\dir\file\abc"); /* file can't have sub dirs */
delete("\dir"); /* has childs, incorrect */
delete("\dir\file");
forceDelete("\dir"); 

有人知道如何识别节点指示文件的路径吗?实现这些功能的最佳方式是什么?

【问题讨论】:

  • “有效路径”究竟是什么意思?
  • 您可以在示例中理解它,正如您在第三行看到的那样,lol 文件夹不存在,因此这是一个无效路径。

标签: algorithm time-complexity trie


【解决方案1】:

验证和分割路径

它是特定于操作系统的,因此只需选择适用于目标系统路径的任何库。

特里

一旦您可以将路径拆分为多个部分,您就可以构建一个 trie。将字符串保留在其边缘。例如,如果您有 foo/bar 路径,则将有 3 个节点和两条边:第一个 (1->2) 标记为 foo,第二个 (2->3) 标记为bar.

您可以在每个节点中存储一个标志,以指示它是常规文件还是目录。

要检查一个目录是否为空,只需确保它的节点没有子节点。

要检查一个目录/文件是否可以创建,获取它的基本目录(路径的所有部分,除了最后一个),通过从根遍历你的 trie 来检查它是否存在,并且它的节点是一个目录,而不是一个普通的文件。

高效遍历

您可以将边存储在将字符串映射到节点的哈希表中。

【讨论】:

  • @是的,根也是一个节点。它是O(n),其中n 是路径的长度。
  • @Matt95 为什么需要在不遍历完整路径的情况下找到节点?
  • @Matt95 你说的名字是什么意思?不是完整路径吗?
  • @Matt95 在一般情况下你不能这样做。可以有很多同名的文件(在不同的目录中)。
  • @Matt95 如果在有多个选项时可以选择任意一个,则可以将节点名称的哈希映射存储到一组指针。
猜你喜欢
  • 1970-01-01
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2021-01-11
  • 2018-06-04
  • 2020-01-13
  • 2022-01-05
相关资源
最近更新 更多