![](/img/trans.png)
[英]Create a 2D Matrix X[][] with letters on X axis and numbers on Y Axis
[英]Revisit: 2D Array Sorted Along X and Y Axis
所以,這是一個常見的面試問題。 已經有了一個話題,我已經讀過,但它已經死了,沒有接受任何答案。 最重要的是,我的興趣在於一個稍微受限制的問題形式,有幾個實際的應用程序。
給定二維數組,使得:
你怎么找到一個元素? 只有最壞的情況分析很重要
我知道的解決方案:
各種方法是:
O(nlog(n)),分別接近每一行。
O(nlog(n))具有強大的最佳和平均表現。
一個是O(n + m):
從一個非極端角落開始,我們假設它是右下角。
讓目標是J. Cur Pos是M.
如果M大於J,則向左移動。
如果M小於J,則向上移動。
如果你不能做到,你就完成了,J不在場。
如果M等於J,那么你就完成了。
最初在其他地方找到,最近從這里被盜。
而且我相信我已經看到一個最壞情況下的O(n + m),但最近的情況是接近O(log(n))。
我很好奇:
現在,我已經證明了我的滿意,天真的分區攻擊總是轉向nlog(n)。 一般來說,分區攻擊似乎具有O(n + m)的最佳最壞情況,並且大多數情況不會在缺席的情況下提前終止。 因此,我也想知道,如果插值探測器可能不比二進制探測器更好,那么我可能會認為這是一個集合之間弱相互作用的集合交叉問題。 我的思緒立即轉向Baeza-Yates十字路口 ,但我沒有時間起草這種方法的改編。 然而,考慮到我懷疑O(N + M)最壞情況的最優性是可證明的,我想我會繼續問這里,看看是否有人可以將反駁論證捆綁在一起,或者將復發關系拉到一起用於插值搜索。
最佳O(m + n)解決方案是從左上角開始,具有最小值。 沿對角線向下向右移動,直到您點擊一個值> =給定元素值的元素。 如果元素的值等於給定元素的值,則返回find為true。
否則,從這里我們可以以兩種方式進行。
策略1:
策略2:讓我表示行索引,j表示我們已經停止的對角元素的列索引。 (這里,我們有i = j,BTW)。 設k = 1。
1 2 4 5 6
2 3 5 7 8
4 6 8 9 10
5 8 9 10 11
這是一個證據,它必須至少是Omega(min(n,m))
。 設n >= m
。 然后考慮在(i,j)
處具有全0
的矩陣,其中i+j < m
,所有2
s,其中i+j >= m
,除了具有i+j = m
的單個(i,j)
1
。 這是一個有效輸入矩陣,並有m
為可能的放置1
。 沒有查詢到陣列(比的實際位置其他1
)可以區分在那些m
可能的放置。 因此,您必須檢查最壞情況下的所有m
位置,以及任何隨機算法的至少m/2
預期位置。
你的一個假設是矩陣元素必須是唯一的,我沒有這樣做。 這是很容易解決,但是,因為你隨便挑一個大數目X=n*m
,更換所有0
獨特的數字少於一X
,所有2
具有獨特的數字大於小號X
和1
與X
。
因為它也是Omega(lg n)
(計數參數),它是Omega(m + lg n)
,其中n>=m
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.