書中從矩陣的一個邊角(如右上角出發(fā)),開始查找某數(shù)值m,找到后打印m所在的矩陣中位置。假設(shè)某一時刻,這時來到了某位置(i,j),如果Data(i,j)<m,將j+1,如果是等于,則m的位置已經(jīng)找到了;如果大于,則將i+1。按照這樣的方式,能夠每次減少一行或一列,直到找到目標(biāo)。這是一道通過比較的方式,查找相應(yīng)元素的算法。
我想到了兩個問題。
- 如果出發(fā)時把位置設(shè)置在中間,會不會比從右上角快些?
- 如果所比較的數(shù)值m換成了序列,如(x(i),y(i))、甚至是三變量(x(i),y(i),z(i)),那還如何從目標(biāo)中找到答案?
問題一:
如果設(shè)置在了中間,那么Data(i,j)<m時,應(yīng)該向數(shù)值遞增的右邊或下邊進行查找,反之,小于則向上邊或左邊進行查找。雖然每次比較貌似需要比較2次,但是由于處于中間的位置,所以工作量減為1/2。而位于矩陣一角,工作量多一倍,每次比較一次,所以速度應(yīng)該是一樣的(時間復(fù)雜度)
問題二:
如果是二變量序列,可以先比較x(i),再比較y(i),多變量序列也是從首位變量到末尾變量的依次比較。這里把二維變量想象成二維平面上,每次比較必然能夠移動一格。如果是三維變量則作為立方體,每次比較也必然能夠移動一格。結(jié)合問題一,在這里,問題已經(jīng)變了,因為每次只需要比較一次,所以應(yīng)該從中間開始找,這樣能夠保證平均情況下工作量是從邊界開始的方式的1/2。
(注:這里類比成二維平面、三維立方,并不是說相鄰序列其中一個是另一個的某個變量加一或減一這樣的關(guān)系。僅僅指的是它們嚴格按照遞增、遞減的規(guī)律。一個區(qū)域弄成“實心”、“滿”(內(nèi)部沒有空白元素)的這樣一種狀態(tài))