用于将分层平面数据(带 ParentID)转换为带缩进级别的排序平面列表的算法

2024-06-22

我有以下结构:

MyClass {
  guid ID
  guid ParentID
  string Name
}

我想创建一个数组,其中包含按层次结构中应显示的顺序排列的元素(例如,根据它们的“左”值),以及将 guid 映射到缩进级别的散列。

例如:

ID     Name     ParentID
------------------------
1      Cats     2
2      Animal   NULL
3      Tiger    1
4      Book     NULL
5      Airplane NULL

这基本上会产生以下对象:

// Array is an array of all the elements sorted by the way you would see them in a fully expanded tree
Array[0] = "Airplane"
Array[1] = "Animal"
Array[2] = "Cats"
Array[3] = "Tiger"
Array[4] = "Book"

// IndentationLevel is a hash of GUIDs to IndentationLevels.
IndentationLevel["1"] = 1
IndentationLevel["2"] = 0
IndentationLevel["3"] = 2
IndentationLevel["4"] = 0
IndentationLevel["5"] = 0

为了清楚起见,层次结构如下所示:

Airplane
Animal
  Cats
    Tiger
Book

我想以尽可能少的次数迭代这些项目。我也不想创建分层数据结构。我更喜欢使用数组、散列、堆栈或队列。

这两个目标是:

  1. 将 ID 的哈希值存储到缩进级别。
  2. 根据所有对象的左值对包含所有对象的列表进行排序。

当我获得元素列表时,它们没有特定的顺序。兄弟姐妹应按其 Name 属性排序。

Update:这似乎是我自己没有尝试提出解决方案,只是希望其他人为我做这项工作。然而,我尝试提出三种不同的解决方案,但我都陷入了困境。原因之一可能是我试图避免递归(也许是错误的)。我不会发布迄今为止的部分解决方案,因为它们是不正确的,并且可能会严重影响其他人的解决方案。


我需要一个类似的算法来对具有依赖性的任务进行排序(每个任务可能有一个需要首先完成的父任务)。我发现拓扑排序。这是一个Python 中的迭代实现 http://www.bitformation.com/art/python_toposort.html有非常详细的评论。

可以在进行拓扑排序时计算缩进级别。只需将节点的缩进级别设置为其父节点的缩进级别 + 1,即可将其添加到拓扑排序中。

请注意,可能存在许多有效的拓扑顺序。为了确保生成的拓扑顺序将父节点与子节点分组,请选择基于对部分排序信息生成的图进行深度优先遍历的拓扑排序算法。

维基百科给出另外两种拓扑排序算法 http://en.wikipedia.org/wiki/Topological_sorting#Algorithms。请注意,这些算法并不那么好,因为第一个算法是广度优先遍历,而第二个算法是递归的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于将分层平面数据(带 ParentID)转换为带缩进级别的排序平面列表的算法 的相关文章

  • 按顺时针顺序对四个点排序

    数组中的四个 2D 点 我需要按顺时针顺序对它们进行排序 我认为只需一次交换操作就可以完成 但我还没有能够正式放下这一点 编辑 在我的例子中 这四个点是凸多边形 编辑 这四个点是凸多边形的顶点 它们不必按顺序排列 如果你想从更数学的角度来看
  • 将曲线图案与图像边缘匹配

    我有一个要搜索沿其边缘的曲线的目标图像和一个包含该曲线的模板图像 我需要实现的是在目标图像中找到模板图像中的曲线的最佳匹配 并根据分数来判断是否匹配 这还包括曲线的旋转和大小调整 目标图像可以是 Canny Edge 检测器的输出 如果这能
  • “真正的”多维数组的定义是什么以及哪些语言支持它们?

    我读过的大多数编程书籍都有以下几行 X 语言不支持真正的多维数组 但您可以使用数组的数组来模拟 近似 它们 由于我的大部分经验都是基于 C 的语言 即 C Java JavaScript php 等 因此我不确定什么是 真正的 多维数组 a
  • 代码高尔夫:莫里斯数列

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 挑战 按字符数计算的最短代码将输出莫里斯数列 http en wikipedia org wi
  • com.jcraft.jsch.JSchException:算法协商失败

    我正在尝试从客户端计算机连接 sftp 服务器 但是 com jcraft jsch JSchException 算法协商失败 我收到这种错误 com jcraft jsch JSchException Algorithm negotiat
  • 如何确定 n 高数字金字塔中的最大路线成本

    我有一个像这样的数字金字塔 7 4 8 1 8 9 2 4 6 7 4 6 7 4 9 4 9 7 3 8 8 routes 32 每个数字都按其系列中的强大程度进行索引 0 9 gt 1 1 8 gt 5 2 8 gt 4 3 7 gt
  • 如何有效地从连续字符串中提取文字单词? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将没有空格的文本拆分为单词列表 https stackoverflow com questions 8870261 how to split text without spaces into li
  • 优化完美平方问题,类似于Python中的硬币找零

    我这里有一个硬币兑换的解决方案 python 中的 leetcode 硬币兑换 https stackoverflow com questions 69517078 coin change leetcode in python 因为完全平方
  • 拉伸数组

    我有一个形成曲线的样本向量 假设其中有 1000 个点 如果我想将其拉伸到填充 1500 个点 给出不错结果的最简单算法是什么 我正在寻找一些只有几行 C C 的东西 我总是想增加向量的大小 并且新向量可以是当前向量大小的 1 1 倍到 5
  • 迭代最近点实现

    我目前正在使用以下伪代码在 C 中实现 ICP 算法 从 获取ICP 简报 http www math tau ac il dcor Graphics adv slides ICP ppt function ICP Scene Model
  • 什么是圈复杂度?

    我时常看到的一个术语是 环复杂度 在这里 我看到了一些关于 如何计算 X 语言的 CC 或 如何用最少的 CC 来完成 Y 的问题 但我不确定我是否真的理解它是什么 On the NDepend 网站 http www ndepend co
  • 有谁知道有一个很好的库可以将一个人的名字映射到他或她的性别吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在寻找一个图书馆或数据库 可以根据一个人的名字或昵称猜测他或她是男性还是女性 就像是 john gt M mary gt F al
  • 如果没有 NULL 我们会做什么?

    我曾经读到过 拥有可空类型绝对是一种邪恶 我相信这是创造它们的人写的一篇文章 在艾达 我相信这是这篇文章 http qconlondon com london 2009 presentation Null References The Bi
  • 迭代格雷码更改位置的有效方法

    有多种迭代方式n 位格雷码 https en wikipedia org wiki Gray code Constructing an n bit Gray code 有些比其他更有效率 但是 我实际上并不需要格雷码 而是想迭代格雷码列表中
  • 如何从文件中读取 N 随机行而不将文件存储在内存中?

    我熟悉从文件中读取单个随机行而不将整个文件读入内存的算法 http perldoc perl org perlfaq5 html How do I select a random line from a file 3f 我想知道这个技术是否
  • 如何用惰性传播实现线段树?

    我在互联网上搜索了有关线段树的实现的信息 但在惰性传播方面却一无所获 之前有一些关于堆栈溢出的问题 但它们专注于解决 SPOJ 的一些特定问题 虽然我认为这是用伪代码对线段树的最好解释 但我需要用惰性传播来实现它 我发现以下链接 除了上面的
  • 如何确定数据库规范化的程度?

    创建数据库结构时 需要遵循哪些好的准则或确定数据库应规范化的程度的好方法是什么 您是否应该创建一个非规范化的数据库并随着项目的进展将其拆分 您是否应该创建完全标准化的表并根据性能需要组合表 您想要开始设计一个符合第三范式的规范化数据库 当您
  • 什么是无锁多线程编程?

    我见过有人 文章 SO 帖子说他们已经设计了自己的 无锁 容器用于多线程使用 假设他们没有使用影响性能的模数技巧 即每个线程只能基于某个模数进行插入 数据结构如何能够是多线程的而且是无锁的 这个问题是针对C和C 的 无锁编程的关键是使用硬件
  • 如何找到包含序列所有元素的最小长度子序列

    给定一个序列 例如S 1 8 2 1 4 1 2 9 1 8 4 我需要找到包含所有元素的最小长度子序列S 没有重复 顺序无关紧要 如何有效地找到这个子序列 注意 有 5 个不同的元素 S 1 2 4 8 9 最小长度子序列必须包含所有这
  • 求 a 范围内的 pow(a^b)modN

    对于给定的b and N以及一系列a say 0 n 我需要找到ans 0 n 1 where ans i 没有a s为此pow a b modN i 我在这里搜索的是可能的重复pow a b modN对于一系列a 以减少计算时间 例子 i

随机推荐

  • MFC - 显示对话框后立即执行代码(.NET 相当于 Form.Shown)

    我正在对 C MFC 项目进行一些小的更改 我是 NET 开发人员 因此 Windows 编程对我来说是新的 我需要在 CDialog 第一次完全显示 绘制 后立即启动一些方法 但仅一次 我怎样才能做到这一点 在 NET中我会处理表格所示
  • Golang 有 libfaketime 替代品吗?

    我想自动化一些测试 我必须操纵系统时间来检查用 golang 编写的程序的身份验证行为 根据这个帖子 https stackoverflow com questions 36024872 libfaketime doesnt work wi
  • 如何生成0到1之间的随机数?

    我想生成 0 1 之间的随机数 我正在尝试以下操作 double r2 return rand 10000 10000 0 int SA double u u r2 但它不会产生预期的结果 我该如何修复它 在你的版本中rand 10000将
  • Json 数组的 Avro 架构

    假设我有以下 json id 1 text some text user id 1 id 1 text some text user id 2 对于这个对象数组来说 合适的 avro 模式是什么 简短回答 该对象数组的适当 avro 架构如
  • 当我调用 fillRoundRect() 时,只有 1 个角被圆化

    当运行此代码时 import java awt Color import java awt Graphics import java awt Graphics2D import java awt RenderingHints import
  • useEffect 钩子加载数据两次,我的意思是它运行了两次[重复]

    这个问题在这里已经有答案了 我正在尝试将数据加载到我的App js文件从后端反应 我使用 redux 构建了从后端到前端的整个数据获取和存储管道 这是代码 function App const dispatch useDispatch us
  • WordPress api v2 按标签过滤帖子

    如何使用 wordpress api v2 获取特定标签的所有帖子 例如 我有一个 ID 为 24 的标签 programming 如何获取包含此 id 的所有帖子 我试过了 wp json wp v2 posts filter tag 2
  • 如何提高PHP性能?

    我已经为 Facebook 创建了 PHP 应用程序 它使用 MySQL Memcached 并在 Centos 2 6 Ghz 和 2 GB RAM 上的 Lighttpd 上运行 它基本上是一个 PHP 文件 第一次运行后会被缓存 每次
  • 在 NestedScrollView 内部时,回收器视图对于大数据加载速度非常慢

    我已经添加了RecyclerView在我的里面NestedScrollView 基本上我希望 RecyclerView 与其他视图一起滚动 我面临的问题是 对于一小部分数据 它工作正常 但对于大量数据 200 个条目 每当我启动活动时 它都
  • MySQL C++ 连接器:获取 insert_id

    我正在使用 mysql 连接器 C 我的表中有一个 auto increment 列 我想在执行插入操作时获取插入 id 有人知道如何得到它吗 谢谢 我的代码是这样的 conn gt setAutoCommit 0 pstmt reset
  • 如何在桌面应用程序中使用 ZeroMQ

    我正在开发一个桌面应用程序 该应用程序部署在Windows和Mac平台上 作为应用程序的一部分 它应该与本机层进行通信 目前本机层和Java层之间的通信是使用套接字完成的 最近团队中有人建议使用zeroMQ 你们中的任何一位都可以澄清我的疑
  • 如何从 DateTime 获取 12 小时日期

    当我获得 DateTime Hour 属性时 我总是获得 24 小时时间 因此 6PM 会给我 18 我如何获得 12 小时 时间 这样 6PM 就给了我 6 我显然可以自己进行检查 但我假设有一个内置函数可以做到这一点 怎么样 DateT
  • UITableView cellForRowAt 中的 API 异步调用

    我有 UITableView 来显示文件列表 每个文件名都使用特定的代码组合进行编码 为了获得真实的文件名 我必须使用当前文件名调用我的服务器端 是否可以在 cellForRowAt indexPath 表视图委托函数上调用此类操作 var
  • 动态添加新选项卡到 mat-tab-group

    我正在使用 Angular v8 和 Angular Materials 特别是 mat tab group 和 mat tab 我想要像下面这样的东西 我希望能够单击 看起来像一个选项卡 结果是它将创建一个新选项卡 单击 后 我们将看到如
  • Google Play 开发者 API - 400 无效值 - InAppPurchases

    我的问题类似于this one https stackoverflow com questions 35019357 google play developer api query purchase token returns invali
  • 在第一次启动时显示另一个视图控制器,不再显示

    我正在使用 swift 制作一个应用程序 它有两个视图控制器 主页 登录页面 我想在第一次启动时显示登录页面 所以我使用了这段代码 class ViewController UIViewController override func sh
  • XNA 3D 碰撞矩阵不起作用

    我之前问过一个关于为什么我的碰撞不起作用的问题 我得到了一个很好的答案 这是有道理的 将我在 DrawModel 方法中所做的相同转换应用于 isCollision 方法 然而 这并没有奏效 我无法弄清楚如何在 isCollision 方法
  • Nodemailer/Gmail - 刷新令牌到底是什么?如何获取刷新令牌?

    我正在尝试在节点应用程序中使用简单的联系表单nodemailer 我希望所有消息都从我为此目的创建的 Gmail 帐户发送到我的个人邮箱 在客户端 我所做的就是获取客户的姓名 邮件 消息并将其发送到服务器 它在本地工作正常 但在部署时无法工
  • 从 SKScene 呈现 UIViewController

    我试图从 SKScene 呈现一个 UIViewController 但是应用程序崩溃了 这是我的代码 1 UIViewController vc self view window rootViewController helpVC Hel
  • 用于将分层平面数据(带 ParentID)转换为带缩进级别的排序平面列表的算法

    我有以下结构 MyClass guid ID guid ParentID string Name 我想创建一个数组 其中包含按层次结构中应显示的顺序排列的元素 例如 根据它们的 左 值 以及将 guid 映射到缩进级别的散列 例如 ID N