由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问个树遍历的线程化问题
相关主题
问题请教讨论 找单链表倒数m的节点 (转载)
Cormen星号题:O(n)遍历二叉树,只能用O(1) extra space按层遍历二叉树,常量空间,如何做到?
怎么用lex处理DFA?今天面了个老印
面题:copy directed graph请问一个算法
innerHtml的问题问个面试题
[合集] 给定一个最小堆,如何查找某数是否存在此堆中?删去单向LINKED LIST中的一个节点,假设HEAD is unknown
请教个throughput的问题[转载] 问一个C++下计时的问题
请教个算法加编程[合集] 请问binary searth tree的遍历问题。
相关话题的讨论汇总
话题: 节点话题: head话题: 处理话题: getnext话题: next
进入Programming版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
纠正了:先描述一下树:
一个多叶子的树,每个节点有多个下层节点。每一个节点也有一个指针指向同层下一个
节点。这个图无法看,可以复制到notepad上看
1--2--3--4
| | | |
| | | 5
| | | |
| | | 6
| | |
| | 7--8
| | |
| | 9
| | |
| | A
| |
| B--C--D
| | |
| | E
| |
| F--G
| |
| H
|
I--J--K--L
如果要遍历1-2-3-4-5-6-7-8-9-A-B-C-D-E-F-G-H-I-J-K-L,并且进行处理则有如下程序
traverse(head){
if (head->needed){
action(head);
wait(50);
if (quit) return;
if (head->deeper)
traverse(head->deeper);
}
head=head->next;
while(head){
traverse(head);
head=head->next;
}
}
要求多线程化这个遍历过程。假定有一个函数getNext,根据current指针来给出下一个
节点需要处理的节点(如果没有,给出原来节点),那么我的工人线程就是这样的
void worker(){
Node* next = getNext(current);
if (next->needed){
action(next);
wait(50);
current=next;
if (quit) return;
}
}
其他要求:
1 要持续化,就是L之后下一个是1,然后2,接着来。
2 每进行一个action,要等50毫秒
3 不是每个节点都要处理,有的不要处理,由needed决定。不处理的节点不要等50毫秒
4 如果每个节点都不要处理,那么就还是要等50毫秒,不能无限循环下去
5 每次50毫秒等待后,有机会判断是否应该退出线程
6 不需要处理的节点其下层节点都不用处理,但是需要尝试处理其同层下一个节点并继续
我目前想到两个方案:一个是写一个遍历的单步iterator函数getNext,有相应的术语
吗?英文叫什么?另一个是,在原来递归函数traverse的基础上,直接等待,和衔接I-
1。但是我怎么避免无限循环没有想好。
我想getNext应该基于堆栈,那么哪个思路好?
系统是Linux, 用C++11,内存512M,ARM。
1 (共1页)
进入Programming版参与讨论
相关主题
[合集] 请问binary searth tree的遍历问题。innerHtml的问题
[合集] 问个多线程的问题[合集] 给定一个最小堆,如何查找某数是否存在此堆中?
怎样提高C#计算程序的performance?请教个throughput的问题
问个C++编译器如何处理函数内的static 变量请教个算法加编程
问题请教讨论 找单链表倒数m的节点 (转载)
Cormen星号题:O(n)遍历二叉树,只能用O(1) extra space按层遍历二叉树,常量空间,如何做到?
怎么用lex处理DFA?今天面了个老印
面题:copy directed graph请问一个算法
相关话题的讨论汇总
话题: 节点话题: head话题: 处理话题: getnext话题: next