avatar
请教一个facebook面试题# JobHunting - 待字闺中
L*Q
1
据称是facebook面试题,大意如下:
给一个int array,找出最长的递增的contiguous subarray。算法worst case是O(n)
,如何提高average 的效率。
算法我想了一个:给定array A,从左到右扫描。最初起点为A[0]找出递增的
contiguous subarray,假设结束与A[k-1]。然后以A[k]为起点扫描下一个递增的
contiguous subarray。worse case为O(n)。
关于如何提高average效率,我想到2个策略:
1. 如果剩下未扫描部分小于当前最长的递增的contiguous subarray,那剩下不用扫描
了;
2. 假设当前最长递增的contiguous subarray长度为k,接下来的扫描起点是A[i],那
么首先比较A[i+k]和A[i+k+1],如果A[i+k]大于A[i+k+1],那么跳过A[i]到A[i+k],以
A[i+k+1]作为扫描起点。因为如果A[i+k]大于A[i+k+1],从A[i]开始的递增的
contiguous subarray长度最多为k,那可以不用扫描。
第二个策略有一个变形时当A[i+k-1] < A[i+k] < A[i+k+1]时以A[i]为扫描起点。
不知道各位还有没有其他提高average 效率的策略呢?
avatar
f*g
2
再贡献一个想法:
第二策略,除了判断
if( A[i+k] > A[i+k+1] ) 跳到 A[i+k+1]
还有
if( A[i+k] - A[i] < k ) 同样跳过
(这里面假设是严格单调递增)
avatar
y*5
3
不能这样跳吧。A[i+1]到A[i+k]可能符合递增。

【在 f***g 的大作中提到】
: 再贡献一个想法:
: 第二策略,除了判断
: if( A[i+k] > A[i+k+1] ) 跳到 A[i+k+1]
: 还有
: if( A[i+k] - A[i] < k ) 同样跳过
: (这里面假设是严格单调递增)

avatar
f*g
4
给个例子?

【在 y******5 的大作中提到】
: 不能这样跳吧。A[i+1]到A[i+k]可能符合递增。
avatar
y*5
5
不知道我理解得是否准确。 A[i+1]可以比A[i]小啊,所以不能根据A[i+k] - A[i] < k
就直接跳
到A[i+k]吧。

【在 f***g 的大作中提到】
: 给个例子?
avatar
L*Q
6
或许是我题目表述不清楚。找到的subarray是连续的,并且递增的。所以A[i+1] < A{i
]的话这个subarray就不符合条件。
我觉得fzblg提供的策略是对的。如果是严格递增,那通过判断A[k+i] - A[i] > k决定
是否跳过A[i]是对的。如果题目没说是严格递增,应该不能这么判断。

k

【在 y******5 的大作中提到】
: 不知道我理解得是否准确。 A[i+1]可以比A[i]小啊,所以不能根据A[i+k] - A[i] < k
: 就直接跳
: 到A[i+k]吧。

avatar
j*u
9
depends on CPU cache line size and current_max_len, in real life jumping may
not be more efficient than liner scanning since it could introduce a lots o
f cache miss/reloading.

【在 s*****y 的大作中提到】
: Ye. I remember this post I read last year. The most niu method.
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。