处理无序树结构数据源(n复杂度查询根节点)
来源:互联网 发布:c语言中逗号运算符 编辑:程序博客网 时间:2024/05/29 13:13
这里主要说数据源无序的情况下,如何找到根节点。
通常能想到的是这样的,以oc为例:
-(NSString*)findRootId:(NSArray*)array{ NSString * str=@""; BOOL haveParent=NO; NSMutableArray *haveExistenceArray=[NSMutableArray array]; for (YPTreeNode *data in array ) { [haveExistenceArray addObject:data.treeId]; if (![haveExistenceArray containsObject:data.parentId]) { for (YPTreeNode *otherdata in array) { if([otherdata.treeId isEqualToString:data.parentId]){ haveParent=YES; break; } } if (!haveParent) { str=data.parentId; } } } return str;}
这种写法有序的情况下复杂度较小 1遍就能搞定,但是最差情况要n2级的复杂度。和朋友讨论,获得一个n复杂度的方法
-(NSString*)findRootId:(NSArray*)array{ NSMutableDictionary *gxDic=[NSMutableDictionary dictionary]; for (YPTreeNode *data in array ) { [gxDic setObject:data.parentId forKey:data.parentId]; } for (YPTreeNode *data in array ) { [gxDic setObject:data.parentId forKey:data.treeId]; } NSString *str=((YPTreeNode*)[array firstObject]).parentId; while ([gxDic objectForKey:str] != str) { str=[gxDic objectForKey:str] ; } return str;}
附:(c语言算法)
#import <Foundation/Foundation.h>//关系换成图结构更省空间int a[10];void insertRood() { // 1 --> 2 a[2] = 1; // 3 --> 1 a[3] = 1; a[4] = 2; a[5] = 2; a[6] = 3;}int findRoot(int child) { while (a[child] != child) { child = a[child]; } return child;}int main(int argc, const char * argv[]) { for (int i = 0; i < 10; i++) { a[i] = i; } insertRood(); //随便找一个节点就可以 int root = findRoot(6); printf("root: %d\n",root); return 0;}
使用以上方法,开源一个树视图代码:
git:YPThreeView
0 0
- 处理无序树结构数据源(n复杂度查询根节点)
- 1~n无序数组时间复杂度为O(n)排序
- 1~n无序数组时间复杂度为O(n)排序
- oracle树结构节点查询
- oracle查询树结构,根节点查询下边所有子节点,然后重新批量插入
- 求完全二叉树的节点数 时间复杂度小于O(N)
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 给定无序自然数数组,求最大连续自然数个数,时间复杂度为O(n)
- 删除无序数组中跳跃重复值并排序(时间复杂度为O(n))
- 无序序列中O(n)时间复杂度寻找最小(最大)的K个数
- 无序整形数组,如何找到最长连续序列长度,时间复杂度O(n)
- 数组进行排序,时间复杂度O(N)&&求无序数组的中位数
- C/C++面试之算法系列--1~n无序数组时间复杂度为O(n)排序
- C/C++ | 27-18 n的无序数组,求排序算法,并且要求时间复杂度为O(n)
- SQL Server 树型结构查询指定节点 SQL Server 树型结构查询的排序
- 有1,2,....一直到n的无序数组,求排序算法,要求时间复杂度为O(n),空间复杂度O(1)
- 有1,2,…,n的无序数组,求排序算法,并且要求时间复杂度为O(n),空间复杂度O(1),一次只能交换两个数
- 有1,2...一直到n的无序数组,求排序算法,并且要求时间复杂度为O(n),时间复杂度为O(1)
- adb error: device offline 的处理方法
- 工程师容易犯的三个错误 (2)
- 垃圾收集真的有用么?
- (OpenCV)函数cv::partition解析
- Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
- 处理无序树结构数据源(n复杂度查询根节点)
- 【CodeForces】[610B]Vika and Squares
- make: *** [.build_release/lib/libcaffe.so] 错误 1
- Fragemnt嵌套出现的问题解决办法
- ajax异步提交以及nicevalidator自定义验证示例
- python3学习笔记1--TypeError: 'dict' object is not callable的解决
- 如何在TabBar上自定义添加个性按钮
- opencv环境在QT的配置
- iOS图片裁剪和小图看大图动画