由买买提看人间百态

topics

全部话题 - 话题: nlogk
1 2 3 下页 末页 (共3页)
f*******r
发帖数: 1086
1
自己刚刚写了一下O(n^2)的算法,还没想明白
O(nlogk)的算法的思想,哪位大侠麻烦赐教一下,
非常感谢!
a**q
发帖数: 3
2
来自主题: JobHunting版 - 问一个merge k sorted array的问题
假设一共有n个节点。我说复杂度是nlogk,但是面试官说复杂度就是n。我问他为什么
,他说因为是建堆,堆不是完全排好序的,所以不用logk用1就可以了。我当时比划了
两下还是觉得应该是logk,但是因为面试时间有限就没有当场深究。现在又想了一下,
确实应该是nlogk而不是n,一个特例是假设k=n,那么就相当于排序,复杂度nlogn。我
该怎么办呢?是发邮件告诉面试官应该是nlogk还是坐以待毙?
l******i
发帖数: 880
3
我一直觉得是nlogk啊。。。堆调整不是logk吗?一共n次,所以nlogk?
我看到一种说法是求最大K个,用最大堆的话是klogn,用最小堆是nlogk?
D***h
发帖数: 183
4
用heap就是O(nlogk)
一般不明确说明的话,都是指最坏情况的。

我知道我把哪搞混了,我写一下,有错的话,请指出来,谢谢
Time Complexity measures分 Best, worst and average
用具体操作的布数来衡量
Big O 给了一个 Upper and lower bounds on the complexity
所以,如果给问到Time Complexity就的列出在那种衡量方法下的布数之和
例如:k个最大数问题
最优,arr从大到小排序,heap不需要进行调整,前k个就是答案;所以操作步骤是n步
;最坏,arr从小到大排序,heap需要调整,步骤 n + n*logk
用big O的话是O(nlogk) <--这个还是不确定到底对不对
n*******n
发帖数: 3
5
来自主题: JobHunting版 - merge k个数组怎样的方法好?
我来试着证明一下本题的时间复杂度是有下限的。而且下限是 O(nlogk), n为所有
integer的个数. 证明如下:
一般常识是sort n个integer最快是O(nlogn). 所以把n个integer分成k组,每组分别
sort,再合起来,不可能比O(nlogn)更快。 n = k * m
分别sort k 个 size 为 m的数组共需时间 k * O(mlogm) = O(nlogm). 所以merge k个
数组的时间不可能小于 O(nlogn)- O(nlogm) = O(nlog(n/m)) = O(nlogk) .
楼上各位已经找到最优解了。
d********r
发帖数: 38
6
NLogK, N is the total number of elements in K lists
Merging two lists with length N1 and N2 is O(N1+N2)
So the first round of k/2 merges totally took O(N) time
So as the second round, etc.
The total number of rounds is LogK, so O(NlogK).
j*********6
发帖数: 407
7
来自主题: JobHunting版 - 发个amazon online test 的题
用priority queue的话, running time 是 k+nlogk 吧, 其实就是O(nlogk) 因为你
就是top k 的问题 然后 override一下comparator的compare 函数 只比较 绝对值就
行了
我觉得这个online test 分析 也是很重要的 因为题目不难 很多人都能做出来 所以
就看谁的分析更好 code 更clean
加油!!
k******e
发帖数: 19
8
来自主题: JobHunting版 - LinkedIn面经(已跪),攒个rp

情况
你这明显是先入为主了,面试最忌讳的就是先入为主,不跟着面试官的思路来想。
这问题是个很基本的东西,MINHEAP和MAXHEAP都可以。基本就是有N个ITEM,找其中的
TOP K的问题。
- 用MINHEAP的话,空间复杂度是O(K), 时间复杂度是O(NlogK)。
这个方法适用于当数据不能PRELOAD进MEMORY,比如说数据是从一个STREAM来的。你
就是先建立一个大小是K的MINHEAP, 在ROOT的就是最小的,其他K-1个都比ROOT大,然
后从省下的N-K个里一个一个取,和你的ROOT比较,如果比ROOT小的就丢掉,比ROOT大
的就REPLACE ROOT,然后将其 SIFT DOWN。
- 用MAXHEAP的话,空间复杂度是O(N), 时间复杂度是 O(KlogN)。
这个办法只能用在N不是太大的时候,可以先HEAPIFY,用时O(N)。现在你的ROOT
是最大的,把ROOT拿掉放进你的RESULT里,你的HEAP的ROOT空了,把最后一个元素放进
ROOT,SIFT DOWN, 又得到一个MAXHEAP,重复刚才的操作K次,得到你的RESU... 阅读全帖
k******e
发帖数: 19
9
来自主题: JobHunting版 - LinkedIn面经(已跪),攒个rp

情况
你这明显是先入为主了,面试最忌讳的就是先入为主,不跟着面试官的思路来想。
这问题是个很基本的东西,MINHEAP和MAXHEAP都可以。基本就是有N个ITEM,找其中的
TOP K的问题。
- 用MINHEAP的话,空间复杂度是O(K), 时间复杂度是O(NlogK)。
这个方法适用于当数据不能PRELOAD进MEMORY,比如说数据是从一个STREAM来的。你
就是先建立一个大小是K的MINHEAP, 在ROOT的就是最小的,其他K-1个都比ROOT大,然
后从省下的N-K个里一个一个取,和你的ROOT比较,如果比ROOT小的就丢掉,比ROOT大
的就REPLACE ROOT,然后将其 SIFT DOWN。
- 用MAXHEAP的话,空间复杂度是O(N), 时间复杂度是 O(KlogN)。
这个办法只能用在N不是太大的时候,可以先HEAPIFY,用时O(N)。现在你的ROOT
是最大的,把ROOT拿掉放进你的RESULT里,你的HEAP的ROOT空了,把最后一个元素放进
ROOT,SIFT DOWN, 又得到一个MAXHEAP,重复刚才的操作K次,得到你的RESU... 阅读全帖
h***k
发帖数: 161
10
来自主题: JobHunting版 - twittier的onsite挂了,来问个常见题
第二个为什么不是O(NlogK)呢?
我的想法是先hashmap把所有words数一遍,O(N) memory+time, 然后用k-size的
minheap遍历hashmap,总共是O(NlogK)。
b*******8
发帖数: 37364
11
来自主题: Military版 - 这个小蒙古最会了
这个小蒙古最会了,K个元素用堆,替换是对数时间,整个开销NlogK
r**u
发帖数: 1567
12
来自主题: JobHunting版 - 一道小题
Given a set S of n distinct numbers and a positive integer k <= n. Determine
the k numbers in S that are closest to the median of S. Find an O(n)
algorithm.
这个就是先找到median,然后搞个max heap,每个数都有个到median的distance, 如果
小于heap顶,放到heap,O(nlogk)。对不?
g*******y
发帖数: 1930
13
来自主题: JobHunting版 - 一道小题
达不到要求
题目说的是O(n)
而k是小于等于n的数
O(nlogk) = O(nlogn)
其实可以这样:
找到median后,对于每个数,算一个新的数组b[i] = abs(a[i]-median)
然后在b[i]中找k-th元素,然后再遍历一遍就可以找到k个最小的了。
这样保证是O(n)
这个题告诉我们,heap也不是万金油,呵呵
c****s
发帖数: 241
14
来自主题: JobHunting版 - Google电面题
我感觉计算了distance之后,维持一个k大小的heap。这样可以做到O(nlogk)。
应该不会有更快的了吧?您老还有什么更好的方法?
B*****t
发帖数: 335
15
来自主题: JobHunting版 - Google电面题
可以做到只比较N+logN+loglogN+...(一共有k项)次, 当k接近N/2时,显然要比nlogk
的算法快, 缺点是可能要多一点儿的空间, 不过也不一定。
l*****a
发帖数: 14598
16
where does K come from?
f*******r
发帖数: 1086
17
也可以说是nLog(n) 吧,我是看到有文章提到k表示子序列的长度
S******a
发帖数: 862
f*******r
发帖数: 1086
19
非常感谢,不过刚看了一下还是没有清晰的思路,
能简单地描述一下思想吗?谢谢了!
b******v
发帖数: 1493
20
wikipedia上面有
c*********7
发帖数: 19373
21
也提出个问题,如果每次都是从上次结束的位置开始岂不是到O(n).比如第一个
increasing 是从1到k1,然后下个搜索从k1+1开始。
l******o
发帖数: 144
22
如果wiki都不能让你理解的话,我们可能也很难了。

非常感谢,不过刚看了一下还是没有清晰的思路,
能简单地描述一下思想吗?谢谢了!
x****r
发帖数: 99
23
wiki里面那个还稍微麻烦了,他那样是可以retrieve这个sequence的方法,如果只需要
长度,可以这样做
数组a[i]里面可以存长度为i的子序列,最小的结尾是多少
基本是这样
数组: 99 100 100 1 2 3 4
第1步. 99 :binary search 最大一个<=99的,没有,所以a[1] = 99;
第2步. 100 :binary search 最大一个<=100的,就是a[1], 所以a[2] = 100;(意
思是现在长度为2的不减数列最少是100结尾)
第3步. 100 :binary search 最大一个<=100的,是a[2],所以a[3] = 100;
第4步. 1 : binary search 最大一个<=1的,没有,所以a[1] = 1;
第5步. 2 : binary search 最大一个<=2的,是a[1],所以A[2] = 2;
第6步. 同上,设置a[3] = 3;
第7步. 同上, 设置a[4] = 4;
至此,取得最大的a的index,就是4,所以长度最长的不减小子串是4,不知道讲明白了
没有
y**i
发帖数: 1112
24
你这个情况如果数组是99 100 100 1 2呢,最后不是到a[2] = 2就停止了,最大index
= 2了?
x****r
发帖数: 99
25
不是的,因为看到第三个100的时候,最大length已经被设置为3了,所以最后还是返回
3,返回的值是
这个数组里index最大的一个非空的值

index
K******g
发帖数: 1870
26
不懂。
首先,binary search整个数组吗?比如说“binary search 最大一个<=99的”, 为什
么“没有”,如果是搜索这个数组,难道99不是吗?如果是搜索剩余的数组,难道4不
是吗?
为什么到第4步的时候,就回到“a【1】”去了?
非常confusing
s*****n
发帖数: 350
27
妙哉!
B*****t
发帖数: 335
28
来自主题: JobHunting版 - Is this a DP problem?
可以用堆来做,复杂度O(nlogk)
这题overlapping 的subproblems不好定义,DP好像不是很适合

smallest window
you know
have a list
propose an
c*********7
发帖数: 19373
29
来自主题: JobHunting版 - 讨论一个题目
不是用heap?k space。这个如果只是数组或stream数据的话应该是用heap。换成矩阵应
该也是吧O(nlogk)。也有人提过用quicksort的方法来做,但不一定能保证每次都能找
到最优piviot。
g*****u
发帖数: 298
30
来自主题: JobHunting版 - 请教一道题目
这个复杂度我觉得不能做到O(n),因为还要看k
我觉得是O(nlogk)
f****4
发帖数: 1359
31
我知道我把哪搞混了,我写一下,有错的话,请指出来,谢谢
Time Complexity measures分 Best, worst and average
用具体操作的布数来衡量
Big O 给了一个 Upper and lower bounds on the complexity
所以,如果给问到Time Complexity就的列出在那种衡量方法下的布数之和
例如:k个最大数问题
最优,arr从大到小排序,heap不需要进行调整,前k个就是答案;所以操作步骤是n步
;最坏,arr从小到大排序,heap需要调整,步骤 n + n*logk
用big O的话是O(nlogk) <--这个还是不确定到底对不对
D***h
发帖数: 183
32
建大小为k的堆,每次操作是logk, n个元素,所以总共是O(nlogk).
h**k
发帖数: 3368
33
来自主题: JobHunting版 - 自己设计的一道面试题

klgn)
用min heap的复杂度是O(nlogk),heap的大小是k,一共插入n个元素。
用binary search的思路可以实现O(n+k)
可以的,需要改一下算法。
f*********5
发帖数: 576
34
来自主题: JobHunting版 - 一道电面题
if u think so,that is fine.
but when we talk about time complexity,we will definitely choose
nlogk ,while not nlogn.
sure,we will use O(k) for extra space while u don't need.
at least we should mention this to the interviewer

50000*16
p******r
发帖数: 2999
35
来自主题: JobHunting版 - 要去google onsite的同学们
明显是因为实时嘛
如果k-th小的话,O(nlogk)也不错
j*****u
发帖数: 1133
36
来自主题: JobHunting版 - 问个算法题5
写了个只返回count的,要返回子序列在这个基础上加一个index array就可以了。
time O(nlogk), space O(k), k == length of LIS
int LIS(int[] array)
{
if (array == null || array.Length == 0)
return 0;
var incIndex = new List { 0 };
for (int i = 1; i < array.Length; ++i)
{
if (array[i] > array[incIndex.Last()])
incIndex.Add(i);
else
{
int l = 0;
for (int r = incIndex.Count; l <= r;)
{
int m = l + (r - l) / 2;
... 阅读全帖
j*****u
发帖数: 1133
37
来自主题: JobHunting版 - 问个算法题5
这是很经典的DP问题,但我只知道O(nlogk)的解。
F**********r
发帖数: 237
38
来自主题: JobHunting版 - 问个算法题8
这回这个问题可能和具体实现有关,就是k-way merge。
1)首先如果能够全部load进内存,是不是其实最好就是依序把它们放进连续内存,然
后直接sort。O(nlogn)
如果用heap的话,要么就是heap的每个element要有data+index(2.1),要么就是要有一
个size k的array存放每个array的active index,但是要决定具体要advance which
array的时候,worst case要把size k array所指向的element和heap top比较一次(2.2
):这本身复杂度就是k*n了。。。。另外虽然heap move down直接成堆复杂度是O(n),
但并不适用在这个case。也就是说用堆的话复杂度是O(nlogk)+ 更多内存 或者 O(n*k
).
这个理解对么?大家怎么看?
w********n
发帖数: 13
39
来自主题: JobHunting版 - MS一道onsite面题 白板coding
the little tricky function is the recursive function, where u need to
determine when to stop partition so that u can achieve Nlogk
one thing to do is to keep a variable in this partition to determine whether
this partition only contains 1 color.
w**7
发帖数: 71
40
面试加州P公司
一面是华人GG
1. 给个数组,给个target, 求找两个数和等于target
然后拓展到找3个数,4个数,分析复杂度
这经典题,没啥说的,hashmap
一个金字塔,有n层,第i层有i个数,有点类似倒置的杨辉三角那种
让你找出一条路从塔顶到塔底,使得这条路链接的节点和最小
这个用hashmap存层数和路径长度值,从底层向上遍历
二面是个白人
2. 给个数组,没排序,已知数组中每个元素距离排序以后的位置最多是k,让你给这个
数组排序
这就是弄个k size 的min-maxheap, 然后先把前0-k-1个元素放到heap里,然后从数组K
位置开始,从heap中取出最小,然后从数组取一个放到heap里,最后O(nlogk)排好
我把方法一说,interviewer感觉可以,说那你写个code发过来吧,然后do you have
any questions。没20分钟就结束了
两面感觉都没啥问题,最后周一就收thank you letter了。有好几次都这样,感觉
technical 题目都没啥问题,两面就悲剧,求经验……move on到麻木了,唉
a*********0
发帖数: 2727
41
来自主题: JobHunting版 - merge k个数组怎样的方法好?
it's still n-way merge with the aid of min-heap. O(nlogk)complexity
f**********t
发帖数: 1001
42
来自主题: JobHunting版 - merge k个数组怎样的方法好?
对。
Min-heap O(nlogk)
method 2那个O(nk)
s***h
发帖数: 662
43
来自主题: JobHunting版 - amazon 2nd phone interview
贡献一点面经.
我准备的时间还不够, 今天这二面有点忐忑.面我的人是个白人小伙子, 说话很快, 不
停的提附加问题.
1. how to pick first k maximum numbers in an array.
me: most straightforward, sort then pick, nlgn + k
he: ok...
me: better way, quick select, n * k
he: what is quick select, why is it linear time?
me: talking...
he: what if array is way bigger than the memory, can this work?
me:...yes...but slower due to swapping...
he: anything better?
me: ...
我不太明白他想问什么,所以没答上这一问,最后他问我有什么问题的时候我就
问了他,他说,你可以构造一个size k heap. then it is nlogk. 哎, 我当时真
没往... 阅读全帖
r*******h
发帖数: 315
44
来自主题: JobHunting版 - 2次电面后被amazon据了
你没有理解min heap和max heap的特点,而且建堆也是要时间的,用max heap,保持heap大小为
k,利用删除堆最大元素只要lgn的特点,所以找第k小只要nlogk,如果你用min heap同样的做法,
最后留下的是最大的k个数,或者你得借助min heap来一次排序,那就跟quick sort一样
最后要nlogn.
w****m
发帖数: 146
45
来自主题: JobHunting版 - 2次电面后被amazon据了
Get your point
ps:建堆是线性的,所以用minheap的话,remove root k次,复杂度是o(n+klogn),这个和
o(k+nlogk)比很难说那个比较快吧?

heap大小为
同样的做法,
一样
H****s
发帖数: 247
46
为啥要用heap 呢?占用额外空间。 直接排序前2k个前k个就是排好序的,然后再加上接下来的k个形
成2k个再排序,直到最后 O(Nlogk)
d**0
发帖数: 124
47
来自主题: JobHunting版 - Quick selection for k unsorted arrays
请教一个题目: k个unsorted arrays,假设都是n个元素。怎么样快速求出median?
不能把所有的array拼到一起再做quick selection。
我用类似quick selection的方法使用同一个pivot element在k个arrays里quick
select,再求 方法应该是这样,但是复杂度分析不出来。一个naive的bound是o(kn),但是这样就和拼
到一起做quick select一样。最后猜了一个o(nlogk)但是自己也不是很信服。
请大牛指教,谢谢!
l*********8
发帖数: 4642
48
来自主题: JobHunting版 - 问一个merge k sorted array的问题
的确是nlogk
f*******n
发帖数: 12623
49
来自主题: JobHunting版 - 问一个merge k sorted array的问题
的确是nlogk。O(1)可以拿到top element,但是要remove它,还是要O(log k)。
假如k=n,那按照他说的就可以用这个方法O(n)去sort一个unsorted的array了。
w****x
发帖数: 2483
50
来自主题: JobHunting版 - 问一个merge k sorted array的问题
nlogk, 怎么会是O(n),
不过现实当中我觉得merge k array用堆不一定比不用直接比较的O(n*k)快, 甚至更慢
1 2 3 下页 末页 (共3页)