算法1:從一個有序二維數組中查找目標值

import numpy as np


#這裏是從一個有序二維數組中(從左到右遞增,從上到下遞增)查找一個數字
#要求的時間複雜度是O(m+n)
#這就要求不能用循環了
#非常機敏的方法是數組從右上角查找,若其大於目標數值,則向左走
#表現爲索引值列數減1
#若其小於目標值,則其行數加1
#表現爲索引值行號加1
#這算法寫得真牛,不知道誰寫出來的,厲害,在此實現,向前輩致敬
#總結:算法的問題就是確定的問題,規律的問題。在這裏,我們知道了遞增方向
#按照常有思維是從小到大找,從左到右找。這在沒有時間複雜度的要求的情況下是
#完全合格的。但是在有O(m+n)的前提下,我們需要找到一個類似"二分法"的路徑。
#從右上角尋找就完全滿足了“二分法”這一點要求。從右上角開始搜索的時候,
#我們知道,向左走,數值減小;向右走,數值增大。這就是“二分法”的一個完美場景。
#牛逼了,前輩!

#定義一個二維數組
a = [[1,4,7,11],
     [2,5,8,12],
     [3,6,9,16],
     [10,13,14,17],
     [18,21,23,26]
     ]
#將數組轉換爲二維矩陣的形式,方便後續查找(要使用到二維數組的維度信息)
a = np.array(a)

#定義右上角索引值,即開始查找的位置
i = 0#row
j = a.shape[1] - 1#col

#定義要查找的目標值
target = 8

#定義一個查詢標記:如果經過後續查找,我們發現其有相應值,標記其爲真;
#否則,不作響應,保持其爲假的狀態
b = False

#查找
while (i>=0)&(j>=0):
    if a[i][j] == target:
        b = True
        break
    if a[i][j]<target:
        i = i + 1
    if a[i][j]>target:
        j = j - 1

#輸出跳出喜歡時候,查找結束的索引值
print("Index:("+str(i)+","+str(j)+")")
#輸出查找結果
if b:
    print("Exist the target num:",target)
else:
    print("Don't exists the target num:",target)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章