由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 一道CS面试题
相关主题
问一道 facebook 面试题弱弱的问问 2sum, 3sum 的问题
问一个G家面试题nearest neighbours search算法
LCA居然有constant time and linear space的解法amazon onsite 面经
问个数组相关的题贡献一下:本版上搜集的 Google 面试题
一道面试题问几个关于hash, map, set的问题
下午的google就只code完一题,没来得及做第二题amazon背靠背电面
面经想成为嵌入式程序员应知道的0x10个基本问题 zz
一道M$算法题。[合集] 想成为嵌入式程序员应知道的0x10个基本问题 zz
相关话题的讨论汇总
话题: xlabel话题: ylabel话题: xy话题: 64话题: int
进入JobHunting版参与讨论
1 (共1页)
r**m
发帖数: 1825
1
给定一组(二维)坐标点的集合,对于一给定输入点,实现空间和时间都是最优的的算
法确定此坐标点是否在集合中?
(x0, y0),(x1,y1)....(xn,yn)
Implement
bool IsInSet(Xin, Yin)
这个坐标系的0 不需要用到Geometric hashing
l*********8
发帖数: 4642
2
quad-tree?

【在 r**m 的大作中提到】
: 给定一组(二维)坐标点的集合,对于一给定输入点,实现空间和时间都是最优的的算
: 法确定此坐标点是否在集合中?
: (x0, y0),(x1,y1)....(xn,yn)
: Implement
: bool IsInSet(Xin, Yin)
: 这个坐标系的0: 不需要用到Geometric hashing

E*******0
发帖数: 465
3
1.先用xin去比较所有点的x坐标,把相等的标记;
2.用yin去比较所有的y坐标,把相等的标记。
3.用1000个bit位去标记。
4.把1和2得到两个标记数值求&&.
5.把有标记位的相应的点的坐标输出。
t****t
发帖数: 6806
4
你这个方法甚至还不如无脑挨个比较.

【在 E*******0 的大作中提到】
: 1.先用xin去比较所有点的x坐标,把相等的标记;
: 2.用yin去比较所有的y坐标,把相等的标记。
: 3.用1000个bit位去标记。
: 4.把1和2得到两个标记数值求&&.
: 5.把有标记位的相应的点的坐标输出。

E*******0
发帖数: 465
5
int XY[][]; //coordinate points.
int numXY; //length of points in the set
bool IsInSet(Xin, Yin)
{
long Xlabel, Ylabel;//assume 64 bits long type.

//First, we segment the points set into several 64-bit sets and one
sit with smaller than 64 bits.
int iteNum = numXY / 64; // number of sets with 64 bits.
int remianNum = numXY % 64; // number of set with smaller 64 bits

//output the points in the set with smaller 64 bits.
Xlabel=0;
Ylabel=0
for (int j=1; j<=remainNum; j++)
{
if (Xin==XY(j,1))
Xlabel=Xlabel+2^(j-1);
if (Yin==XY(j,2))
Ylabel=Ylabel+2^(j-1);
}
Xlabel=Xlabel&&Ylabel;
for (j=1; j {
if (Xlabel % 2!=0)
output (XY(j,1), XY(j,2));
Xlabel=Xlable/2;
}
//output the points in the sets with 64 bits.
for (int i=1; i<=iteNum; i++)
{
Xlabel=0;
Ylabel=0
for (int j=1; j<=64; j++)
{
if (Xin==XY(i*64+j,1))
Xlabel=Xlabel+2^(j-1);
if (Yin==XY(i*64+j,2))
Ylabel=Ylabel+2^(j-1);
}
Xlabel=Xlabel&&Ylabel;
for (j=1; j<64; j++)
{
if (Xlabel % 2!=0)
output (XY(i*64+j,1), XY(i*64+j,2));
Xlabel=Xlable/2;
}
}
}
E*******0
发帖数: 465
6
算法复杂度是O(n),空间复杂度O(1).
E*******0
发帖数: 465
7

你难道能够想到更好的方法么?

【在 t****t 的大作中提到】
: 你这个方法甚至还不如无脑挨个比较.
y****n
发帖数: 743
8
因为给定的坐标集合没有任何规律(顺序),无论怎样优化,每个做标都需要处理一下。
所以最优的时间复杂度应该是O(n)。
所以,最简单的循环比较应该是空间和时间都是最优的的算法。

【在 r**m 的大作中提到】
: 给定一组(二维)坐标点的集合,对于一给定输入点,实现空间和时间都是最优的的算
: 法确定此坐标点是否在集合中?
: (x0, y0),(x1,y1)....(xn,yn)
: Implement
: bool IsInSet(Xin, Yin)
: 这个坐标系的0: 不需要用到Geometric hashing

E*******0
发帖数: 465
9
我考虑到如果用int变量来标记的话,空间复杂度会是O(n),如果用bit来标记,复杂度
会降低。
而且,我是64个点64个点的处理的。所以,空间复杂度是O(1).
p*****2
发帖数: 21240
10
如果要是多次调用的话到可以优化一下。
相关主题
下午的google就只code完一题,没来得及做第二题弱弱的问问 2sum, 3sum 的问题
面经nearest neighbours search算法
一道M$算法题。amazon onsite 面经
进入JobHunting版参与讨论
t****t
发帖数: 6806
11
我不是说了么, 无脑比较就比你这个强啊! 复杂度一样, 程序长度是你的1/10, 还易读!
bool is_in_set(int x, int y)
{
for (int i=0; i if (x==data[i].x && y==data[i].y) return true;
}
return false;
}
当然我不是说无脑比较就是最好. 但是要是做得比无脑比较还要差, 那你还拿出来干嘛?

【在 E*******0 的大作中提到】
: 我考虑到如果用int变量来标记的话,空间复杂度会是O(n),如果用bit来标记,复杂度
: 会降低。
: 而且,我是64个点64个点的处理的。所以,空间复杂度是O(1).

t****t
发帖数: 6806
12
这算法已经够差的了, 这实现的比算法还要差!

【在 E*******0 的大作中提到】
: int XY[][]; //coordinate points.
: int numXY; //length of points in the set
: bool IsInSet(Xin, Yin)
: {
: long Xlabel, Ylabel;//assume 64 bits long type.
:
: //First, we segment the points set into several 64-bit sets and one
: sit with smaller than 64 bits.
: int iteNum = numXY / 64; // number of sets with 64 bits.
: int remianNum = numXY % 64; // number of set with smaller 64 bits

t****t
发帖数: 6806
13
先问清楚能不能对数据预处理吧...

【在 l*********8 的大作中提到】
: quad-tree?
E*******0
发帖数: 465
14
要不你给个好的算法,看看阿。
t****t
发帖数: 6806
15
why do you want to mark in the first place? it's totally unnecessary and
waste of time.

【在 E*******0 的大作中提到】
: 我考虑到如果用int变量来标记的话,空间复杂度会是O(n),如果用bit来标记,复杂度
: 会降低。
: 而且,我是64个点64个点的处理的。所以,空间复杂度是O(1).

y****n
发帖数: 743
16
我觉得thrust在楼上给的无脑比较是最佳算法。
不需要额外空间,算法O(n)。

【在 E*******0 的大作中提到】
: 要不你给个好的算法,看看阿。
t****t
发帖数: 6806
17
如果不能预处理, 这个就可以了. 但是考虑到面试题一般不会这么简单, 还是问清楚比
较好.

【在 y****n 的大作中提到】
: 我觉得thrust在楼上给的无脑比较是最佳算法。
: 不需要额外空间,算法O(n)。

y****n
发帖数: 743
18
只是就题论题,如果能预处理还要平衡“时间和空间”和“空间换时间”的问题。
因为原题要求时间空间都优化。

【在 t****t 的大作中提到】
: 如果不能预处理, 这个就可以了. 但是考虑到面试题一般不会这么简单, 还是问清楚比
: 较好.

r**m
发帖数: 1825
19
Nod, 应该先问一下这个,已知的点集合是否可以预处理。
用简单hash是不是最快。

【在 p*****2 的大作中提到】
: 如果要是多次调用的话到可以优化一下。
H****r
发帖数: 2801
20
x0-xn, y0-yn 是啥类型?

【在 r**m 的大作中提到】
: 给定一组(二维)坐标点的集合,对于一给定输入点,实现空间和时间都是最优的的算
: 法确定此坐标点是否在集合中?
: (x0, y0),(x1,y1)....(xn,yn)
: Implement
: bool IsInSet(Xin, Yin)
: 这个坐标系的0: 不需要用到Geometric hashing

相关主题
贡献一下:本版上搜集的 Google 面试题想成为嵌入式程序员应知道的0x10个基本问题 zz
问几个关于hash, map, set的问题[合集] 想成为嵌入式程序员应知道的0x10个基本问题 zz
amazon背靠背电面[合集] 请教一道算法面试题
进入JobHunting版参与讨论
r**m
发帖数: 1825
21
integer

【在 H****r 的大作中提到】
: x0-xn, y0-yn 是啥类型?
H****r
发帖数: 2801
22
if 0 to generate some ID for O(1) search. For example :
a = min(x,y)
b = max(x,y)
id = a + b*1000

【在 r**m 的大作中提到】
: integer
g**x
发帖数: 373
23
why not
id = x*1000 + y?
I guess the next question interviewer will ask is, what to do if the
coordinates are distributed randomly and widely.
If not using hash, sorting seems to be necessary. So it has to be O(NlogN)?

【在 H****r 的大作中提到】
: if 0: to generate some ID for O(1) search. For example :
: a = min(x,y)
: b = max(x,y)
: id = a + b*1000

H****r
发帖数: 2801
24
my bad. id = x*100 + y is good. min,max are wrong lolz

【在 g**x 的大作中提到】
: why not
: id = x*1000 + y?
: I guess the next question interviewer will ask is, what to do if the
: coordinates are distributed randomly and widely.
: If not using hash, sorting seems to be necessary. So it has to be O(NlogN)?

m*****y
发帖数: 93
25
用preprocessing.
kd-tree: O(n) space, O(sqrt(n)) query time.
range-tree w/ factorial cascading: O(nlogn) space, O(logn) query time.
y*******g
发帖数: 6599
26
kd tree面试的时候基本写不出吧。。

【在 m*****y 的大作中提到】
: 用preprocessing.
: kd-tree: O(n) space, O(sqrt(n)) query time.
: range-tree w/ factorial cascading: O(nlogn) space, O(logn) query time.

e***l
发帖数: 710
27
实际应用肯定hash,几行code就完了,而且O(1)时间查找。
不hash的话,直接radix sort这些点,就是先对x排序,再对y排序,O(NlogN)。
以后每次查找只需要O(logN),二分查x,然后在x相同的点中查y。
1 (共1页)
进入JobHunting版参与讨论
相关主题
[合集] 想成为嵌入式程序员应知道的0x10个基本问题 zz一道面试题
[合集] 请教一道算法面试题下午的google就只code完一题,没来得及做第二题
问一道老题面经
新鲜面试题一道M$算法题。
问一道 facebook 面试题弱弱的问问 2sum, 3sum 的问题
问一个G家面试题nearest neighbours search算法
LCA居然有constant time and linear space的解法amazon onsite 面经
问个数组相关的题贡献一下:本版上搜集的 Google 面试题
相关话题的讨论汇总
话题: xlabel话题: ylabel话题: xy话题: 64话题: int