社区
C++ 语言
帖子详情
c++ stl 平衡树
liuq901
2009-12-13 08:21:11
如何用c++的stl(如map,set)来实现平衡二叉树,要支持以logn的时间复杂度插入某个数,删除某个节点以及查找第k大的数,请各位大牛解答,感激不尽
...全文
955
19
打赏
收藏
c++ stl 平衡树
如何用c++的stl(如map,set)来实现平衡二叉树,要支持以logn的时间复杂度插入某个数,删除某个节点以及查找第k大的数,请各位大牛解答,感激不尽
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
liuq901
2009-12-15
打赏
举报
回复
算了,不挣扎了,自己去写一个吧,谢谢各位的帮忙。
taodm
2009-12-15
打赏
举报
回复
高2就能写平衡树,不简单啊,纯鼓励一下,并bs一下奥数对人的摧残。
evidence
2009-12-15
打赏
举报
回复
对线性存储的元素快排就好了,时间复杂度lgn,
平衡树没必要
鼠
2009-12-15
打赏
举报
回复
[Quote=引用 15 楼 liuq901 的回复:]
引用 14 楼 kyee 的回复:
关于AVL平衡二叉树可以参考下:
http://blog.csdn.net/kyee/archive/2009/10/20/4704329.aspx
http://blog.csdn.net/kyee/archive/2009/10/22/4711654.aspx
我是一名高二学生搞信息学奥赛的,平衡树我会自己写,我只是想知道C++能不能用STL实现平衡树,14楼的好像不是C++的标准库内的吧?
[/Quote]
STL 的 set 和 map
就是
平衡树,但是没有对数时间查找 k 大元素的能力。
用 STL 只是手段,不是目的,如果不适用就不要用。改写 STL 容器还不如自己重新写。
liuq901
2009-12-15
打赏
举报
回复
[Quote=引用 14 楼 kyee 的回复:]
关于AVL平衡二叉树可以参考下:
http://blog.csdn.net/kyee/archive/2009/10/20/4704329.aspx
http://blog.csdn.net/kyee/archive/2009/10/22/4711654.aspx
[/Quote]
我是一名高二学生搞信息学奥赛的,平衡树我会自己写,我只是想知道C++能不能用STL实现平衡树,14楼的好像不是C++的标准库内的吧?
daidodo
2009-12-14
打赏
举报
回复
[Quote=引用楼主 liuq901 的回复:]
如何用c++的stl(如map,set)来实现平衡二叉树,要支持以logn的时间复杂度插入某个数,删除某个节点以及查找第k大的数,请各位大牛解答,感激不尽
[/Quote]
我的理解,插入和删除都是以key为关键字的,达到logn的复杂度,偏偏查询的时候用排序索引k,所以用map和set,都不能达到要求。
能想到的,只有heap。stl里有用顺序容器(例如vector)实现的heap算法,插入和删除都能达到logn复杂度,查询排序索引为k的元素,更能达到O(1)的复杂度(直接算出索引)。
很土
2009-12-14
打赏
举报
回复
关于AVL平衡二叉树可以参考下:
http://blog.csdn.net/kyee/archive/2009/10/20/4704329.aspx
http://blog.csdn.net/kyee/archive/2009/10/22/4711654.aspx
liuq901
2009-12-14
打赏
举报
回复
[Quote=引用 12 楼 daidodo 的回复:]
引用 9 楼 liuq901 的回复:
是吗,heap不是只支持取出堆顶元素吗?
heap的本质就是完全2叉树,在顺序容器里表示就是:
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ / \ / \ / \
8 9 10 11 12 13 14 15
在这个已排序的序列里找第k大的数据,自己实现算法就行了。
[/Quote]
堆是只保证左右孩子小于根,并不一定向你画的那样啊,堆只支持取出最值,这是肯定的。
daidodo
2009-12-14
打赏
举报
回复
[Quote=引用 9 楼 liuq901 的回复:]
是吗,heap不是只支持取出堆顶元素吗?
[/Quote]
heap的本质就是完全2叉树,在顺序容器里表示就是:
1
/ \
2 3
/ \ / \
4 5 6 7
/ \ / \ / \ / \
8 9 10 11 12 13 14 15
在这个已排序的序列里找第k大的数据,自己实现算法就行了。
cattycat
2009-12-14
打赏
举报
回复
这样的话,还是用B+树吧,B+数插入和删除的复杂度在lgk(N),好像是这个,反正是对数级别。所有的叶子节点是顺序排列的,要find第k大的话,直接在叶子节点上找就行。
wind_breez
2009-12-14
打赏
举报
回复
map本身就是用平衡树(红黑)实现的,怎么又要反过来啊?
liuq901
2009-12-14
打赏
举报
回复
是吗,heap不是只支持取出堆顶元素吗?
鼠
2009-12-13
打赏
举报
回复
[Quote=引用 5 楼 cphj 的回复:]
map是有序的,用迭代器遍历,到第K个,就是第K小的元素
找第K小的,就反向遍历
[/Quote]
这个明显达不到 O(log(n)) 的要求……
比较常见的做法是在每个结点里面维护以该节点为根的子树的结点数,然后从根结点二分。
cphj
2009-12-13
打赏
举报
回复
更正
找第K大的,就反向遍历
cphj
2009-12-13
打赏
举报
回复
map是有序的,用迭代器遍历,到第K个,就是第K小的元素
找第K小的,就反向遍历
鼠
2009-12-13
打赏
举报
回复
stl 的平衡树没有维护结点数,实现 k 大元素不太方便,不如另外做一个。
我是不知道有没有做好的~
liuq901
2009-12-13
打赏
举报
回复
但是我不知道如何查找第k大的元素,find函数只支持查找值为k的元素
heis07w
2009-12-13
打赏
举报
回复
用map实现平衡二叉树是什么意思,map一般就是平衡二叉树实现的
鼠
2009-12-13
打赏
举报
回复
貌似已经就是了吧……
C++
_
STL
库_源代码
C++
stl
库源代码,可供学习数据结构的同学提供参考和帮助。加深对数据结构的理解。
c++
tree class 符合
stl
规范
工作中常用类似树的类,有时候自己写个,或者用
stl
的类库模拟一个,今天看到一个比较好的tree 类库,已经有不少地方在用,感觉还不错,特贴来共享,希望对大家有用
linux
c++
库函数手册
STL
参考手册
linux
c++
库函数手册
STL
参考手册 linux
c++
库函数手册
STL
参考手册 linux
c++
库函数手册
STL
参考手册 linux
c++
库函数手册
STL
参考手册
tree(
c++
tree容器)
该源码可用于建立树结构的数据结构,与
c++
标准库中中vector, list, map等用法完全相同,只需要在程序中包含该头文件即可使用,可以作为标准库的补充
使用
STL
学习数据结构
一本同时学习
c++
,
STL
和数据结构极佳的书!
C++ 语言
65,210
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章