由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 关于在rotated sorted array中查找的问题
相关主题
问个面试题目请帮我看看这个java method? 一直不正常运行
underlying sort algorithm for SET in STL?请大虾验证!
关于 sorted and shifted 数组我写的quick sort
这个同学很神一个java class downcast 的问题
C++指针问题 int (*) [10]为什么不能成功排序
binary number question一道Microsoft的面试题
问一个基本的查找问题If using C++, please avoid the use of STL for these questio (转载)
convert sorted array to binary search tree, 非递归怎么解?Partitioning (转载)
相关话题的讨论汇总
话题: int话题: val话题: bsch话题: else话题: return
进入Programming版参与讨论
1 (共1页)
P*****f
发帖数: 2272
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}.这个似乎二分查找无法搞定,只能线性搜索了吧。
讨论一下
N********n
发帖数: 8363
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}.这个似乎二分查找无法搞定,只能线性搜索了吧。
: 讨论一下

P*****f
发帖数: 2272
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

N********n
发帖数: 8363
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;

s****u
发帖数: 118
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}.这个似乎二分查找无法搞定,只能线性搜索了吧。
: 讨论一下

s****u
发帖数: 118
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;
: }

N********n
发帖数: 8363
7
I doubt so. It should still be log(N).

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

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

【在 N********n 的大作中提到】
: ???
N********n
发帖数: 8363
10
oh i see.

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

【在 s****u 的大作中提到】
: 这个我们讨论过啦,是要O(n)的
1 (共1页)
进入Programming版参与讨论
相关主题
Partitioning (转载)C++指针问题 int (*) [10]
如何将若干已升序排序好的数组合并在一起,并仍然是升序?binary number question
Re: amazon onsite interview question (转载)问一个基本的查找问题
问一下bitmap sorting的问题convert sorted array to binary search tree, 非递归怎么解?
问个面试题目请帮我看看这个java method? 一直不正常运行
underlying sort algorithm for SET in STL?请大虾验证!
关于 sorted and shifted 数组我写的quick sort
这个同学很神一个java class downcast 的问题
相关话题的讨论汇总
话题: int话题: val话题: bsch话题: else话题: return