2013-05-07 23 views
1

我剛剛發現堆(現實生活中和Python),現在我試圖確定某個隨機數列表是否按堆順序排列。
問題是我不確定自己是否真的瞭解實踐中的「堆」,即使我相信提供的定義是合理的。確定一個數字列表是否是堆棧順序,Python 3.2

我發現了一些練習問題,應該可以幫助您編寫堆僞代碼。 這是問題,下面是我嘗試在解決它:

編寫檢查號碼列表是否是堆或不是一個函數:

給出一個列表,這數字是否返回True以堆的順序排列,如果數字不是,則返回False,並讓程序返回並打印答案。

實施例:

  • 返回true: 以下列表是在堆順序:[0,1,10,2,3,11,12,4,5,19,15]
  • 返回False 以下列表不是在堆順序:[0,1,10 2,15,11,12,4,5,19,3]

然後有2只列出了一堆的隨機數字從1 - 100扔進去,還有一些重複。

def heap_or(A): 
     n = len(A) 
     for i in range(n): 
     start = (len(A) - 2)/2 
     while start >= 0: 
      siftDown(A, start, len(A) - 1) 
      start -= 1: 
      return 'True' 
     else: 
      return 'False' 

    def siftDown(A, start, end): 
    root = start 
    while root * 2 + 1 <= end: 
     number = root * 2 + 1 
     if number + 1 <= end and A[number] < A[number + 1]: 
      number += 1 
     if number <= end and A[root] < A[number]: 
      A[root], A[number] = A[number], A[root] 
      root = number 
     else: 
      return 

    print 

有人能請我幫忙嗎?因爲我不確定我是否正確地定義了堆,所以代碼也給我一個困難!

+0

我們可以給你一個手,但你應該包括你的'siftDown'的實現 – jamylak 2013-05-07 08:35:45

+0

@jamylak我幾乎肯定這是不正確的,因爲我試圖建模我的人後,別人的堆最小/最大排序,但我無論如何,現在將它添加到我的原始帖子! – user2227808 2013-05-07 08:40:17

+0

@jamylak - 你認爲你現在能夠幫助我嗎? – user2227808 2013-05-07 11:01:54

回答

2

heap屬性(對於最大堆)是每個節點應該大於或等於其父節點。元素i的存儲在數組中的二進制堆父是件(i - 1) // 2

def is_heap(A): 
    return all(A[i] >= A[(i - 1) // 2] for i in range(1, len(A))) 

顯然,因爲堆被存儲在陣列我們並不需要檢查的形狀。

+0

嗨,謝謝你的回覆。我不是在尋找最大的堆 - 這是否重要?所以,說我有上面提到的其中一個,或者其他的,我該如何解決? (A): 返回全部(A [i]> = A [(i-1)// 2] A = [1,2,4,5,3,2,5,2]對於我在範圍內(1,len(A)))' 更重要的是,我將如何獲得它以向我顯示答案,是或否?再次感謝! – user2227808 2013-05-07 13:16:42

+0

@ user2227808你必須有*一些*比較功能;如果這是'> ='那麼你有一個最大的堆。如果你真的想要一個字符串作爲結果,只需使用'str'。 – ecatmur 2013-05-07 13:55:26

+0

對不起,不清楚!我認爲我只是對我應該在哪裏放置打印函數感到困惑,所以Python解釋器會告訴我它是True還是False。我試着在返回所有內容之前先加上一對括號,但是返回了一個「無效的合成詞」。 – user2227808 2013-05-07 14:09:35

相關問題