Young tableau

Definition

已知一個2維矩陣,其中的元素每一行從左至右依次增加,每一列從上到下依次增加。即對于矩陣Table有Table[i][j] ≤Table[i][j + 1], Table[i][j] ≤ Table[i + 1][j],我們也稱這樣的矩陣為楊氏矩陣。

Insert

因為每個元素的下面一個元素和右面一個元素都會比當前元素大,所以右下角的元素是最大的一個元素。所以我們將元素放到矩陣的右下角,然后再來調整元素的位置。我們將這個元素與它上面的元素和左面的元素進行比較,將最大的那個元素與這個元素進行交換,如果這個元素就是最大的話,則已經插入正確的位置。若上面和左面的兩個元素相等且大于這個元素,則我們可以交換哪一個都可以。

Delete

我們要把矩陣中指定的一個元素去掉,那么我們需要調整它右面和下面的元素來符合楊氏矩陣的特性。所以我們不妨將要刪除的元素置為NAN。我們將這個元素與他右面和下面的元素中最小的那個進行交換(類似insert操作)

Find

我們從右上角開始來查找,目的元素比當前元素大則向下查,比當前元素小則向左查。這樣們可以在2*n的次數內找到想要的元素。

Modify

我們將這個重新賦值的元素和它四周的元素進行比較,通過交換調整位置來滿足楊氏矩陣的特性。

#-*-coding:utf-8-*-
from numpy import *

def insert(m, value, i, j):
    m[i][j] = value
    largesti = i
    largestj = j

    if i-1>=0 and (isnan(m[i-1][j]) or m[i-1][j] > m[i][j]):
        largesti = i-1
        largestj = j
    if j-1>=0 and (isnan(m[i][j-1]) or m[i][j-1] > m[largesti][largestj]):
        largesti = i
        largestj = j - 1
    if i!=largesti or j!=largestj:
        temp = m[i][j]
        m[i][j] = m[largesti][largestj]
        m[largesti][largestj] = m[i][j]
        insert(m,value,largesti,largestj)

def delete(m, i, j):
    m[i][j] = NAN
    mini = i
    minj = j
    if i+1<m.shape[0]:
        mini = i+1
        minj = j
    if j+1<m.shape[1] and (isnan(m[mini][minj]) or m[i][j+1] < m[mini][minj]):
        mini = i
        minj = j+1

    if mini!=i or minj!=j:
        temp = m[i][j]
        m[i][j] = m[mini][minj]
        m[mini][minj] = temp
        delete(m, mini, minj)

def find(m,value):
    i = 0
    j = m.shape[1] - 1
    while i<m.shape[0] and j >=0:
        if isnan(m[i][j]) or m[i][j] > value:
            j = j -1
        elif isnan(value) or m[i][j] < value:
            i = i+ 1
        else:
            return True
    return False

def modify(m, i, j, value):
    m[i][j] = value
    nexti = i
    nextj = j
    if i-1>=0 and m[i-1][j] > m[i][j]:
        nexti = i-1
        nextj = j
    if j-1>=0 and m[i][j-1] > m[nexti][nextj]:
        nexti = i
        nextj = j-1

    if i+1<m.shape[0] and m[i][j] > m[i+1][j]:
        nexti = i+1
        nextj = j
    if j+1<m.shape[1] and( isnan(m[nexti][nextj]) or m[i][j+1] < m[nexti][nextj]):
        nexti = i
        nextj = j+1

    if nexti!=i or nextj!=j:
        temp = m[i][j]
        m[i][j] = m[nexti][nextj]
        m[nexti][nextj] = temp
        modify(m, nexti, nextj, value)

if __name__ == '__main__':
    m = array([[2,4,6,NAN],[3,7,10,NAN],[5,12,NAN,NAN],[8,NAN,NAN,NAN]])
    h,v = m.shape
    print 'matrix'
    print m
    print '-'*24
    print 'after insert 7'
    insert(m,7,h-1,v-1)
    print m
    print '-'*24
    print 'after delete m[0][0]'
    delete(m,0,0)
    print m
    print '-'*24
    print 'if 12 in the matrix'
    print find(m,12)
    print '-'*24
    print 'after update m[1][1] to 1'
    modify(m, 1, 1,1)
    print m

腳本輸出

matrix
[[  2.   4.   6.  nan]
 [  3.   7.  10.  nan]
 [  5.  12.  nan  nan]
 [  8.  nan  nan  nan]]
------------------------
after insert 7
[[  2.   4.   6.  nan]
 [  3.   7.  10.  nan]
 [  5.   7.  nan  nan]
 [  8.  12.  nan  nan]]
------------------------
after delete m[0][0]
[[  3.   4.   6.  nan]
 [  5.   7.  10.  nan]
 [  7.  12.  nan  nan]
 [  8.  nan  nan  nan]]
------------------------
if 12 in the matrix
True
------------------------
after update m[1][1] to 1
[[  1.   4.   6.  nan]
 [  3.   5.  10.  nan]
 [  7.  12.  nan  nan]
 [  8.  nan  nan  nan]]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,769評論 0 33
  • 一. Java基礎部分.................................................
    wy_sure閱讀 3,835評論 0 11
  • Java經典問題算法大全 /*【程序1】 題目:古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子...
    趙宇_阿特奇閱讀 1,909評論 0 2
  • 逛空間偶然看到別人發的一些照片,出去玩,彈鋼琴,去外地......看到她們身上的自信、陽光,我卻從內心感到自卑。可...
    姜潮閱讀 341評論 0 0