Young tableau

Definition

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

Insert

因?yàn)槊總€(gè)元素的下面一個(gè)元素和右面一個(gè)元素都會(huì)比當(dāng)前元素大逝薪,所以右下角的元素是最大的一個(gè)元素隅要。所以我們將元素放到矩陣的右下角,然后再來(lái)調(diào)整元素的位置董济。我們將這個(gè)元素與它上面的元素和左面的元素進(jìn)行比較步清,將最大的那個(gè)元素與這個(gè)元素進(jìn)行交換,如果這個(gè)元素就是最大的話虏肾,則已經(jīng)插入正確的位置廓啊。若上面和左面的兩個(gè)元素相等且大于這個(gè)元素,則我們可以交換哪一個(gè)都可以封豪。

Delete

我們要把矩陣中指定的一個(gè)元素去掉谴轮,那么我們需要調(diào)整它右面和下面的元素來(lái)符合楊氏矩陣的特性。所以我們不妨將要?jiǎng)h除的元素置為NAN吹埠。我們將這個(gè)元素與他右面和下面的元素中最小的那個(gè)進(jìn)行交換(類似insert操作)

Find

我們從右上角開始來(lái)查找第步,目的元素比當(dāng)前元素大則向下查,比當(dāng)前元素小則向左查缘琅。這樣們可以在2*n的次數(shù)內(nèi)找到想要的元素雌续。

Modify

我們將這個(gè)重新賦值的元素和它四周的元素進(jìn)行比較,通過交換調(diào)整位置來(lái)滿足楊氏矩陣的特性胯杭。

#-*-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]]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市受啥,隨后出現(xiàn)的幾起案子做个,更是在濱河造成了極大的恐慌,老刑警劉巖滚局,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件居暖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡藤肢,警方通過查閱死者的電腦和手機(jī)太闺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘁圈,“玉大人省骂,你說(shuō)我怎么就攤上這事∽钭。” “怎么了钞澳?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涨缚。 經(jīng)常有香客問我轧粟,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任兰吟,我火速辦了婚禮通惫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘混蔼。我一直安慰自己履腋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布拄丰。 她就那樣靜靜地躺著府树,像睡著了一般。 火紅的嫁衣襯著肌膚如雪料按。 梳的紋絲不亂的頭發(fā)上奄侠,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音载矿,去河邊找鬼垄潮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛闷盔,可吹牛的內(nèi)容都是我干的弯洗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼逢勾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼牡整!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起溺拱,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤逃贝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后迫摔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沐扳,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年句占,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沪摄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纱烘,死狀恐怖杨拐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凹炸,我是刑警寧澤戏阅,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站啤它,受9級(jí)特大地震影響奕筐,放射性物質(zhì)發(fā)生泄漏舱痘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一离赫、第九天 我趴在偏房一處隱蔽的房頂上張望芭逝。 院中可真熱鬧,春花似錦渊胸、人聲如沸旬盯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胖翰。三九已至,卻和暖如春切厘,著一層夾襖步出監(jiān)牢的瞬間萨咳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工疫稿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留培他,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓遗座,卻偏偏與公主長(zhǎng)得像舀凛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子途蒋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法猛遍,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法号坡,繼承相關(guān)的語(yǔ)法螃壤,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,596評(píng)論 18 399
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)筋帖。 張土汪:刷leetcod...
    土汪閱讀 12,737評(píng)論 0 33
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,805評(píng)論 0 11
  • Java經(jīng)典問題算法大全 /*【程序1】 題目:古典問題:有一對(duì)兔子,從出生后第3個(gè)月起每個(gè)月都生一對(duì)兔子冤馏,小兔子...
    趙宇_阿特奇閱讀 1,850評(píng)論 0 2
  • 逛空間偶然看到別人發(fā)的一些照片逮光,出去玩代箭,彈鋼琴,去外地......看到她們身上的自信涕刚、陽(yáng)光嗡综,我卻從內(nèi)心感到自卑《拍可...
    姜潮閱讀 278評(píng)論 0 0