- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在解决排序算法时,我需要一些建议。这个特定的算法将有一个包含 n 个项目的列表的输入。每个项目都有一个 ID 和一个父 ID。像这样:
[
{id : 1, parent_id : 0},
{id : 2, parent_id : 1},
{id : 3, parent_id : 1},
{id : 4, parent_id : 2},
{id : 5, parent_id : 4},
{id : 6, parent_id : 0}
]
这是预期的结果:
[
{id : 1, parent_id : 0, children:
[
{id : 2, parent_id : 1, children:
[
{id : 4, parent_id : 2, children:
[
{id : 5, parent_id : 4}
]}
]
},
{id : 3, parent_id : 1}
]},
{id : 6, parent_id : 0}
]
我最初的想法是将算法拆分为层次结构级别,递归地解析每个级别。所以它在理论上看起来像这样:
我刚刚开始研究一些函数式编程范例,并开始阅读更多有关算法和分析的内容,只是因为我不熟悉递归思考。
所以我的问题是:
到目前为止,我已经创建了一个算法,该算法将具有 2 级层次结构。它看起来像这样(目前用 php 编写,只是概念代码的证明):
function sortParentsChildren($unsortedList, $parentIDKey = "parent_id", $childNameKey = "children"){
$sortedList = array();
foreach($unsortedList as $key => $value){
$children = array();
//See if there are any children for this item
foreach($unsortedList as $skey => $svalue){
if($value["id"] == $svalue[$parentIDKey]){
$children[] = $svalue;
}
}
//Add all items with parent id = 0 to the root
if($value["parent_id"] == 0){
$sortedList[$key] = $value;
}
//Check if there were any children
if(sizeof($children) > 0){
//Search each children and see if they have any matches
foreach($children as $ckey => $cvalue){
foreach($unsortedList as $s2key => $s2value){
if($cvalue["id"] == $s2value[$parentIDKey]){
$children[$ckey][$childNameKey][] = $s2value;
}
}
}
$sortedList[$key] = $value;
$sortedList[$key][$childNameKey] = $children;
}
}
return $sortedList;
}
最佳答案
您通常会使用某种字典数据结构来执行此操作。基本上,你有这样的结构:
Node
{
int id;
int parent;
Node[] children;
}
您将其保存在字典或以 id 为键的关联数组中。创建一个id值为0,parent id为-1的节点。
按父 ID 对输入数组进行排序,然后遍历列表。对于每个项目,将其添加到字典中。同时查找它的父节点(它已经在字典中,因为输入列表已按父 id 排序),并将新节点添加到父节点的子列表中。
完成后,node[0] 包含构造的层次结构。
我不是 PHP 程序员,所以您必须使用伪代码:
Nodes = new associative array
Nodes[0] = new Node(0, -1)
sortedInput = sort input by parent id
foreach item in sortedInput
Nodes[item.id] = new Node(item.id, item.parent);
//Nodes[item.parent].Children.Add(Node);
// Above line commented and replaced with this.
Nodes[item.parent].Children.Add(Nodes[item.id]);
end
// Nodes[0] contains the hierarchy
OutputNode(Nodes[0], "")
输出层级的函数是递归的:
OutputNode(Node, indent)
print indent, Node.id, Node.parent
foreach (child in Node.children)
OutputNode(child, indent+" ");
end
end
关于algorithm - 创建对具有无限子层次结构的页面进行排序的算法时的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5886142/
我正在尝试将多个水平链接的 Button 和 TextView 垂直链接为 View 集,但仍保持平面 View 层次结构。这是我的初始布局和代码:
到目前为止,我已经在Google BigQuery上训练了几种模型,目前我需要查看模型的外观(即架构,损失函数等)。 有没有办法获取这些信息? 最佳答案 仔细阅读文档后,我可以说该功能尚不存在。我什至
本文实例讲述了PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)。分享给大家供大家参考,具体如下: 前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个
我是一名优秀的程序员,十分优秀!