我一直在自学自己的python中的数据结构,不知道我是否过度思考(或解密!)以下问题:
我的目标是提出一种有效的算法
使用该算法,我的目标是确定是否存在一个整数,使A [i] = i在增加的整数数组中
然后我想找一个big-O表示法的运行时间作为n的长度的函数?
所以这不会只是O(log n)的略微修改版本,其功能相当于:f(i)= A [i] - i。我读这个问题错了吗?任何帮助将不胜感激!
答案 0 :(得分:3)
注1:因为你说整数正在增加,你已经排除了数组中有重复(否则你会说单调增加)。因此,如果第一个元素大于1,则快速检查将排除是否没有解决方案。换句话说,为了有任何解决方案的机会,第一个元素必须是< = 1。
注2:类似于注1,如果最后一个元素是<数组的长度,然后没有解决方案。
总的来说,我认为你能做的最好的就是二元搜索。您将它捕获在低指数和高指数之间,然后检查低指数和高指数之间的中间指数。如果array [middle]等于middle,则返回yes。如果它小于中间,则将左侧设置为中间+ 1。否则,将右侧设置为中间 - 1.如果左侧变为>对,返回号码。
运行时间为O(log n)。
编辑:如果允许单调增加,算法不起作用。练习:解释原因。 : - )
答案 1 :(得分:0)
你是对的。在i
大小的数组中查找元素A
的确是O(Log A)
。
但是,你可以做得更好:O(Log A) -> O(1)
如果你为时间复杂度交换内存复杂性,那就是"优化器"倾向于这样做。
我的意思是:如果你插入新的数组元素到"高效"哈希表,您可以在常量时间find
O(1)
函数
这很大程度上取决于您要插入的元素:
insert
?答案 2 :(得分:0)
这是一个有趣的问题:-)
您可以使用二分法找到a[i] == i
:
0 1 2 3 4 5 6
a = [-10 -5 2 5 12 20 100]
When i = 3, i < a[i], so bisect down
When i = 1 i > a[i], so bisect up
When i = 2 i == a[i], you found the match
运行时间 O(log n)。