簡體   English   中英

重溫:沿X軸和Y軸排序的2D陣列

[英]Revisit: 2D Array Sorted Along X and Y Axis

所以,這是一個常見的面試問題。 已經有了一個話題,我已經讀過,但它已經死了,沒有接受任何答案。 最重要的是,我的興趣在於一個稍微受限制的問題形式,有幾個實際的應用程序。

給定二維數組,使得:

  • 元素是獨一無二的
  • 元素沿x軸和y軸排序。
  • 兩種類型都不占優勢,因此兩種類型都不是二級排序參數。
  • 結果,對角線也被分類。
  • 所有這些都可以被認為是朝着同一個方向發展。 也就是說,他們都是提升,或者他們都在下降。
  • 從技術上講,我認為只要你有一個> / = / <比較器,任何總排序都應該有效。
  • 元素是數字類型,帶有單周期比較器。
  • 因此,內存操作是大O分析的主要因素。

你怎么找到一個元素? 只有最壞的情況分析很重要

我知道的解決方案:
各種方法是:
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:

  1. 在列中向上移動並搜索給定元素,直到我們到達結尾。 如果找到,則返回發現為真
  2. 在行中向左移動並搜索給定元素,直到我們到達結尾。 如果找到,則返回發現為真
  3. 返回發現為false

策略2:讓我表示行索引,j表示我們已經停止的對角元素的列索引。 (這里,我們有i = j,BTW)。 設k = 1。

  • 重復以下步驟,直到ik> = 0
    1. 搜索[ik] [j]是否等於給定元素。 如果是,返回發現為真。
    2. 搜索a [i] [jk]是否等於給定元素。 如果是,返回發現為真。
    3. 增量k

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具有獨特的數字大於小號X1X

因為它也是Omega(lg n) (計數參數),它是Omega(m + lg n) ,其中n>=m

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM