【发布时间】:2014-12-12 22:57:27
【问题描述】:
给定一组整数,如果一个集合的元素以递增的方式排序,我怎么知道哪个整数在某个位置?例如,给定一组整数,如何获得较小的整数或第二个较小的整数等
是否可以在对数时间内做到这一点?我的意思是,我知道有很明显的方法可以按照我的要求做,但是有没有在对数时间内有效的方法?
【问题讨论】:
-
在有序集合中,您应该能够在恒定时间 O(1) 内做到这一点。最小的整数在 S[0] 处,第二小的整数在 S[1] 处,还是我遗漏了什么?
-
您可能会惊讶于向量对于整数的速度有多快。像 $v.insert(std::lower_bound(v.begin(), v.end(), new_val), new_val);$ 作为插入函数,然后只需 $v[k]$ 即可找出其中的值地点k。插入确实需要在插入点之后复制所有数据,但找到该点是 log(n) 时间,并且通常复制是一条 CPU 指令,尽管可能是几个周期。尝试一下,对其进行基准测试,看看它是否满足您的需求。
标签: c++ performance stl set binary-search-tree