由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 为什么我写的binary search 比 linear还慢?
相关主题
问个经典问题的improvementMathWorks 面经
leetcode 中部分binary search 总结how to query in the universal hash table?
几个Java面试题 (转载)leetcode 的 Insert Interval 就是过不了大的
Amazon二面看到一个题目
Bloomberg 电面发Facebook intern面经
Binary search很靠基本功啊how would you create the index for a book
听说binary search程序非常难写对,是吗?新鲜Amazon面经(附参考答案) 顺便求各种大公司refer
一道设计题问一个CareerCup上的题
相关话题的讨论汇总
话题: task话题: int话题: start话题: deadline话题: mid
进入JobHunting版参与讨论
1 (共1页)
p*****2
发帖数: 21240
1
public void Add(Task task)
{
int i=0;
for(;i {
if(task.deadline {
list.Insert(i,task);
break;
}
}
if(i==list.Count)
list.Add(task);
}
public void Add(Task task)
{
if (list.Count == 0)
{
list.Add(task);
return;
}
int start = 0;
int end = list.Count - 1;
while (start <= end)
{
if (start == end)
{
if (list[start].deadline > task.deadline)
list.Insert(start, task);
else
list.Insert(start + 1, task);
return;
}
int mid = (start + end) / 2;
if (list[mid].deadline == task.deadline)
{
list.Insert(mid, task);
return;
}
if (list[mid].deadline < task.deadline)
{
start = mid + 1;
}
else
{
end = mid - 1;
}
}
}
}
c**********e
发帖数: 2007
2
How do you know it is slower than linear? Is your n large enough?
q****x
发帖数: 7404
3
你的二分法罗嗦。

【在 p*****2 的大作中提到】
: public void Add(Task task)
: {
: int i=0;
: for(;i: {
: if(task.deadline: {
: list.Insert(i,task);
: break;
: }

L*****R
发帖数: 56
4
N不够大吧
p*****2
发帖数: 21240
5
我做一道题,linear能pass 50%的test case, binary 只能过10%。虽然写的罗嗦,但
是还是很奇怪为什么这样子。
我后来从后往前linear search, 还是这个结果。
f*******t
发帖数: 7549
6
你这个是java的arraylist?
insert操作是O(n)+各种memory copy的吧,相比之下查找的复杂度已经影响不大了。。
q****x
发帖数: 7404
7
不是list吗?

【在 f*******t 的大作中提到】
: 你这个是java的arraylist?
: insert操作是O(n)+各种memory copy的吧,相比之下查找的复杂度已经影响不大了。。
: 。

r****t
发帖数: 10904
8
arraylist 有 random access 吗?insert 该没有关系,两个办法最后都是 insert 一次。
话说你这个 binary search 有私货,找到以后 return iterator 好了,为啥要 insert 呢?

【在 f*******t 的大作中提到】
: 你这个是java的arraylist?
: insert操作是O(n)+各种memory copy的吧,相比之下查找的复杂度已经影响不大了。。
: 。

f*******t
发帖数: 7549
9
list不能random access

【在 q****x 的大作中提到】
: 不是list吗?
q****x
发帖数: 7404
10
good catch, thx.

【在 f*******t 的大作中提到】
: list不能random access
相关主题
Binary search很靠基本功啊MathWorks 面经
听说binary search程序非常难写对,是吗?how to query in the universal hash table?
一道设计题leetcode 的 Insert Interval 就是过不了大的
进入JobHunting版参与讨论
p*****2
发帖数: 21240
11

一次。
insert 呢?
return iterator什么意思呀?我insert是因为下次还需要用。

【在 r****t 的大作中提到】
: arraylist 有 random access 吗?insert 该没有关系,两个办法最后都是 insert 一次。
: 话说你这个 binary search 有私货,找到以后 return iterator 好了,为啥要 insert 呢?

q****x
发帖数: 7404
12
你算法有问题。
如果是数组,插入是线性的。
如果是链表,二分查找不行。

【在 p*****2 的大作中提到】
:
: 一次。
: insert 呢?
: return iterator什么意思呀?我insert是因为下次还需要用。

r****t
发帖数: 10904
13
只 pass 部分估计是边界条件没搞对。自己能搞点 test case 么?

【在 p*****2 的大作中提到】
: 我做一道题,linear能pass 50%的test case, binary 只能过10%。虽然写的罗嗦,但
: 是还是很奇怪为什么这样子。
: 我后来从后往前linear search, 还是这个结果。

r****t
发帖数: 10904
14
c++ 里面 search 都返回 iterator/pointer, 以为 java 应该更自然点。。。

【在 p*****2 的大作中提到】
:
: 一次。
: insert 呢?
: return iterator什么意思呀?我insert是因为下次还需要用。

q****x
发帖数: 7404
15
bool std::binary_search()

【在 r****t 的大作中提到】
: c++ 里面 search 都返回 iterator/pointer, 以为 java 应该更自然点。。。
p*****2
发帖数: 21240
16

相当于java 的 arraylist, 关键是两种算法都有insert呀。

【在 q****x 的大作中提到】
: 你算法有问题。
: 如果是数组,插入是线性的。
: 如果是链表,二分查找不行。

q****x
发帖数: 7404
17
你怎么知道慢?

【在 p*****2 的大作中提到】
:
: 相当于java 的 arraylist, 关键是两种算法都有insert呀。

p*****2
发帖数: 21240
18

test case 运行到50%超时, binary运行到10%就超时了。很奇怪。

【在 q****x 的大作中提到】
: 你怎么知道慢?
r****t
发帖数: 10904
19
okay, 原来只要返回 true/false 就行了。

【在 q****x 的大作中提到】
: bool std::binary_search()
x***2
发帖数: 93
20
同意这个观点。
楼主不妨注释掉insert操作再跑一次

【在 f*******t 的大作中提到】
: 你这个是java的arraylist?
: insert操作是O(n)+各种memory copy的吧,相比之下查找的复杂度已经影响不大了。。
: 。

a**p
发帖数: 258
21
同意楼上说的。search是重点。写了点玩玩,看看对不对。
public class Test {
Task[] list;
int search(Task task) {
int i = 0;
do {
if (task.deadline <= list[i].deadline) {
return i;
}
} while (++i < list.length);
return list.length-1;
}
int binarySearch(Task task) {
int i = list.length;
int k = 0;
int j;
do {

if ((i+1 + k) % 2 != 0){
j = (i+k)/2;
} else{
j = (i+1 + k)/2;
}

if (j == i) {
if (task.deadline >= list[i-1].deadline) {
return i-1;
} else {
return i;
}
} else {
if (task.deadline >= list[j].deadline) {
k = j;
} else {
i = j;
j = 0;
}
}

} while (j < i);
return j;
}
public static void main(String[] args) {
int size = 5*1000*1000;
Test test = new Test();
test.list = new Task[size];
Task task;
for (int i = 0; i < size; i++) {
task = new Task(i);
test.list[i] = task;
}
Task t = new Task((int) (Math.random() * size));
System.out.println("list size:"+size+"; deadline:"+t.deadline);
long time = System.currentTimeMillis();
System.out.println("index: " + test.search(t));
System.out.println(System.currentTimeMillis() - time);
time = System.currentTimeMillis();
System.out.println("index: " + test.binarySearch(t));
System.out.println(System.currentTimeMillis() - time);
}
}
class Task {
int deadline;
Task(int i){
deadline = i;
}
}
1 (共1页)
进入JobHunting版参与讨论
相关主题
问一个CareerCup上的题Bloomberg 电面
我对G有心理阴影。。Binary search很靠基本功啊
LI这题是不是没有比linear更好的解法了?听说binary search程序非常难写对,是吗?
问几道题目一道设计题
问个经典问题的improvementMathWorks 面经
leetcode 中部分binary search 总结how to query in the universal hash table?
几个Java面试题 (转载)leetcode 的 Insert Interval 就是过不了大的
Amazon二面看到一个题目
相关话题的讨论汇总
话题: task话题: int话题: start话题: deadline话题: mid