Redian新闻
>
关于在rotated sorted array中查找的问题
avatar
关于在rotated sorted array中查找的问题# Programming - 葵花宝典
P*f
1
在sorted array中找一个数,binary search。
有个题是sorted array right/left shift 了k位(k unkown),问怎么查找。
这也是个老题了,我所知的solution是用modified binary search, 根据 left end,
right end 和middle point 的大小关系来判断下一次搜索的范围。不过今天突然想到
一个例子;
original array = { 1,2,3,3,3,3,3,3,3,3,3,3,,3,....3}. shift k位后成了
{3,3,3,3...3,1,2,3,3,3,3,3,3,3}.这个似乎二分查找无法搞定,只能线性搜索了吧。
讨论一下
avatar
N*n
2
int bsch (int[] a, int k, int val)
{ int l = 0, r = a.length - 1;
while (l < r)
{ int m = (l + r) / 2;
if (a[(m + k) % a.length] < val)
l = m + 1;
else if (a[(m + k) % a.length] > val)
r = m - 1;
else
return (m + k) % a.length; // found
}
return -1; // not found
}

【在 P*****f 的大作中提到】
: 在sorted array中找一个数,binary search。
: 有个题是sorted array right/left shift 了k位(k unkown),问怎么查找。
: 这也是个老题了,我所知的solution是用modified binary search, 根据 left end,
: right end 和middle point 的大小关系来判断下一次搜索的范围。不过今天突然想到
: 一个例子;
: original array = { 1,2,3,3,3,3,3,3,3,3,3,3,,3,....3}. shift k位后成了
: {3,3,3,3...3,1,2,3,3,3,3,3,3,3}.这个似乎二分查找无法搞定,只能线性搜索了吧。
: 讨论一下

avatar
P*f
3
k 是未知的

int bsch (int[] a, int k, int val)
{ int l = 0, r = a.length - 1;
while (l < r)
{ int m = (l + r) / 2;
if (a[(m + k) % a.length] < val)
l = m + 1;
else if (a[(m + k) % a.length] > val)
r = m - 1;
else
return (m + k) % a.length; // found
}
return -1; // not found
}

【在 N********n 的大作中提到】
: int bsch (int[] a, int k, int val)
: { int l = 0, r = a.length - 1;
: while (l < r)
: { int m = (l + r) / 2;
: if (a[(m + k) % a.length] < val)
: l = m + 1;
: else if (a[(m + k) % a.length] > val)
: r = m - 1;
: else
: return (m + k) % a.length; // found

avatar
N*n
4
int solveK (int[] a)
{
int l = 0, r = a.length - 1;
while (l < r) {
m = (l + r) / 2;
if (a[l] > a[m])
r = m;
else
l = m;
}
return l + 1;
}
bsch (a, solveK(a), val);

end,
想到
吧。

【在 P*****f 的大作中提到】
: k 是未知的
:
: int bsch (int[] a, int k, int val)
: { int l = 0, r = a.length - 1;
: while (l < r)
: { int m = (l + r) / 2;
: if (a[(m + k) % a.length] < val)
: l = m + 1;
: else if (a[(m + k) % a.length] > val)
: r = m - 1;

avatar
s*u
5
这个我们讨论过啦,是要O(n)的

【在 P*****f 的大作中提到】
: 在sorted array中找一个数,binary search。
: 有个题是sorted array right/left shift 了k位(k unkown),问怎么查找。
: 这也是个老题了,我所知的solution是用modified binary search, 根据 left end,
: right end 和middle point 的大小关系来判断下一次搜索的范围。不过今天突然想到
: 一个例子;
: original array = { 1,2,3,3,3,3,3,3,3,3,3,3,,3,....3}. shift k位后成了
: {3,3,3,3...3,1,2,3,3,3,3,3,3,3}.这个似乎二分查找无法搞定,只能线性搜索了吧。
: 讨论一下

avatar
s*u
6
/cy 相等的时候不知道走那边的

【在 N********n 的大作中提到】
: int solveK (int[] a)
: {
: int l = 0, r = a.length - 1;
: while (l < r) {
: m = (l + r) / 2;
: if (a[l] > a[m])
: r = m;
: else
: l = m;
: }

avatar
N*n
7
I doubt so. It should still be log(N).

【在 s****u 的大作中提到】
: 这个我们讨论过啦,是要O(n)的
avatar
N*n
8
???

【在 s****u 的大作中提到】
: /cy 相等的时候不知道走那边的
avatar
s*u
9
找k的时候,就是找最小,但是不能你那样找的 :)

【在 N********n 的大作中提到】
: ???
avatar
N*n
10
oh i see.

【在 s****u 的大作中提到】
: 找k的时候,就是找最小,但是不能你那样找的 :)
avatar
g*n
11
更准确地说,是O(log(N-M))+O(M)。
M是rotate前的数组中最长的不增子序列(即,该子序列中各项都相等)。

【在 s****u 的大作中提到】
: 这个我们讨论过啦,是要O(n)的
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。