gpt4 book ai didi

algorithm - 不造树的树排序

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:10:12 27 4
gpt4 key购买 nike

我需要写一些东西来获取如下所示的数据:

B
b
c
a
A
b
a
D
a
b
a
C

然后像这样排序:

A
a
b
B
a
b
c
C
D
a
a
b

数据与我在上面展示的完全一样(字母除外)。它是一个多行字符串,其中选项卡的数量决定了树中的层次结构级别。

我希望能够自行对层次结构的每个级别进行排序。

我一直无法想出一个像样的算法,所以我在这里问。

我在 PHP 中执行此操作,但是任何伪代码方法将不胜感激。

此外,我意识到我可以先构建一棵树,然后对该树进行排序和输出,但我正在努力寻找更优雅的解决方案。

谢谢。

最佳答案

我在提问的过程中实际上解决了这个问题,所以我会回答我自己的问题,这可能对这里的其他人有帮助。可能还有其他好的答案...

class TreeLineSorter {
function sort($tree_lines) {
$sorted_line_groups = $this->group_and_sort_lines($tree_lines);

return $this->get_sorted_lines($sorted_line_groups);
}

private function cmp_line_groups($a, $b) {
return strcasecmp($a[0], $b[0]);
}

private function get_line_level($line) {
return strspn($line, "\t");
}

private function get_line_groups($lines) {
$curr_level = $this->get_line_level($lines[0]);
$line_groups = array();
$idx = -1;

foreach($lines as $line) {
$level = $this->get_line_level($line);

if ($level == $curr_level) {
$idx++;
}

$line_groups[$idx][] = $line;
}

return $line_groups;
}

private function group_and_sort_lines($lines) {
$line_groups = $this->get_line_groups($lines);

usort($line_groups, array($this,'cmp_line_groups'));

foreach($line_groups as $key=>$group) {
if (sizeof($group) > 1) {
$new_group = array(array_shift($group));
$new_group = array_merge($new_group, $this->group_and_sort_lines($group));

$line_groups[$key] = $new_group;
}
}

return $line_groups;
}

private function get_sorted_lines($sorted_line_groups) {
$lines = array();

foreach($sorted_line_groups as $group) {
if (is_array($group)) {
if (sizeof($group) > 1) {
$lines = array_merge($lines, $this->get_sorted_lines($group));
}
else {
$lines[] = $group[0];
}
}
else {
$lines[] = $group;
}
}

return $lines;
}
}

下面是示例用法:

    $sample_text = <<<QES
B
\tb
\tc
\ta
A
\tb
\ta
D
\ta
\t\tb
\t\ta
C
QES;

$tree_lines = explode("\n",$sample_text);

$tree_line_sorter = new TreeLineSorter();

$sorted_tree_lines = $tree_line_sorter->sort($tree_lines);

print_r($tree_lines);
print_r($sorted_tree_lines);

关于algorithm - 不造树的树排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11515269/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com