Arrays 具有递增整数数组的高效算法
我一直在用python自学数据结构,不知道自己是否过度思考(或思考不足!)以下问题:Arrays 具有递增整数数组的高效算法,arrays,algorithm,search,bisection,Arrays,Algorithm,Search,Bisection,我一直在用python自学数据结构,不知道自己是否过度思考(或思考不足!)以下问题: 我的目标是找到一个有效的算法 使用该算法,我的目标是确定一个整数i是否存在,使得在递增整数数组中的[i]=i 然后我想用big-O表示法来计算运行时间,作为n的函数,a的长度 那么这不就是一个稍微修改过的O(logn)版本吗,它的函数等价于:f(i)=a[i]-i。我看错这个问题了吗?任何帮助都将不胜感激 注1:因为您说整数在增加,所以排除了数组中存在重复项(否则您会说单调增加)。因此,如果第一个元素大于1
- 我的目标是找到一个有效的算法
- 使用该算法,我的目标是确定一个整数i是否存在,使得在递增整数数组中的[i]=i
- 然后我想用big-O表示法来计算运行时间,作为n的函数,a的长度
那么这不就是一个稍微修改过的O(logn)版本吗,它的函数等价于:f(i)=a[i]-i。我看错这个问题了吗?任何帮助都将不胜感激 注1:因为您说整数在增加,所以排除了数组中存在重复项(否则您会说单调增加)。因此,如果第一个元素大于1,则可以快速检查是否没有解决方案。换句话说,要有解决方案的机会,第一个元素必须是正确的,返回no 运行时间为O(logn) 编辑:如果允许单调递增,则算法不起作用。练习:解释原因。:-)
- 你说得对。在
大小的数组中查找元素A
实际上是i
O(loga)
- 但是,如果您用内存复杂性换取时间复杂性,您可以做得更好:
,这正是“优化器”倾向于做的O(loga)->O(1)
O(1)
这在很大程度上取决于要插入的元素:
- 它们是独一无二的吗?想想碰撞
- 您多长时间插入一次
- 这是一个有趣的问题:-)
您可以使用二分法来定位
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
01123456
a=[-10-525122100]
当i=3时,ia[i]时,将其平分
当i=2i=a[i]时,您找到了匹配项
运行时间是O(logn)写一些代码作为开始:)你关于复杂性的推理似乎是正确的。属于程序员SE,而不是这里。这归结为在函数中找到零,其中f(x)=a[x]-x。使用二分法只是一种可能的方法,另一种方法是使用两条边之间的线性近似来找到零点的可能位置。