Datawhale編程集訓第三天

一秆乳、隊列

1缀程、簡介

隊列(queue)诲泌,是先進先出(FIFO, First-In-First-Out)的線性表,在具體應用中通常用鏈表或者數組來實現伸眶,隊列只允許在后端(稱為rear)進行插入操作惊窖,在前端(稱為front)進行刪除操作,隊列的操作方式和堆棧類似厘贼,唯一的區(qū)別在于隊列只允許新數據在后端進行添加界酒。


2、隊列的操作

隊列的兩種主要操作是:向隊列中插入新元素和刪除隊列中的元素涂臣。插入操作也叫做入隊盾计,刪除操作也叫做出隊。入隊操作在隊尾插入新元素赁遗,出隊操作刪除隊頭的元素。
隊列的另外一項重要操作是讀取隊頭的元素族铆。這個操作叫做peek()岩四。該操作返回隊頭元素,但不把它從隊列中刪除哥攘。

Queue()        定義一個空隊列剖煌,無參數材鹦,返回值是空隊列。
enqueue(item)  在隊列尾部加入一個數據項耕姊,參數是數據項桶唐,無返回值。
dequeue()      刪除隊列頭部的數據項茉兰,不需要參數尤泽,返回值是被刪除的數據,隊列本身有變化规脸。
isEmpty()      檢測隊列是否為空坯约。無參數,返回布爾值莫鸭。
size()         返回隊列數據項的數量闹丐。無參數,返回一個整數被因。

隊列操作代碼:

# -*- coding:utf-8 -*-
class Queue():
 #初始化隊列
 def __init__(self,size):
  self.queue=[]
  self.size=size
  self.tail=0
 #判斷隊列是否為滿卿拴,為滿返回True
 def Full(self):
  if self.tail==self.size:
   return True
  else:
   return False
 #判斷隊列是否為空,為空返回True
 def Empty(self):
  if self.tail==0:
   return True
  else:
   return False
 #進隊
 def queuein(self,content):
  if self.Full():
   print 'The queue is full!'
  else:
   self.queue.append(content)
   self.tail+=1
 #出隊
 def queueout(self):
  if self.Empty():
   print 'The queue is empty!'
   return None
  else:
   content=self.queue[0]
   self.queue.pop(0)
   self.tail-=1
   return content
 #遍歷隊列
 def queueall(self):
  if self.Empty():
   print 'The queue is empty!'
  else:
   for i in range(0,self.tail):
    print self.queue[i]

二梨与、堆排序

1巍棱、簡介

堆排序是利用堆這種數據結構而設計的一種排序算法。堆排序是一種選擇排序蛋欣,它的最壞航徙,最好,平均時間復雜度均為O(nlogn)陷虎,它也是不穩(wěn)定排序到踏。
堆排序是一種選擇排序,整體主要由構建初始堆+交換堆頂元素和末尾元素并重建堆兩部分組成尚猿。其中構建初始堆經推導復雜度為O(n)窝稿,在交換并重建堆的過程中,需交換n-1次凿掂,而重建堆的過程中伴榔,根據完全二叉樹的性質,[log2(n-1),log2(n-2)...1]逐步遞減庄萎,近似為nlogn踪少。所以堆排序時間復雜度一般認為就是O(nlogn)級。

2糠涛、堆的特點

堆是完全二叉樹援奢,又分為大頂堆和小頂堆;大頂堆:每個結點的值都大于或等于其左右葉子結點的值忍捡;小頂堆:每個結點的值都小于或等于其左右葉子結點的值集漾。

大根堆

小根堆

3切黔、堆排序的主要思想:

將待排序列構造成一個大頂堆,此時堆頂元素就是整個序列的最大值具篇,將堆頂元素與堆數組的末尾元素進行交換纬霞。然后將剩余的n-1個元素重新構造成一個堆,并得到整個序列的次大值驱显。如此反復執(zhí)行诗芜,得到一個有序的序列。

4秒紧、代碼實現

#_*_coding:utf-8_*_

def sift_down(arr, node, end):
    root = node
    while True:
        # 從root開始對最大堆調整
        child = 2 * root +1  #left child
        if child  > end:
            break
        print("v:",root,arr[root],child,arr[child])
        print(arr)
        # 找出兩個child中交大的一個
        if child + 1 <= end and arr[child] < arr[child + 1]: #如果左邊小于右邊
            child += 1 #設置右邊為大
 
        if arr[root] < arr[child]:
            # 最大堆小于較大的child, 交換順序
            tmp = arr[root]
            arr[root] = arr[child]
            arr[child]= tmp
 
            # 正在調整的節(jié)點設置為root
           root = child 
            
        else:
            # 無需調整的時候, 退出
            break
    print('-------------')
 
def heap_sort(arr):
    # 從最后一個有子節(jié)點的孩子還是調整最大堆
    first = len(arr) // 2 -1
    for i in range(first, -1, -1):
        sift_down(arr, i, len(arr) - 1)
    #[29, 22, 16, 9, 15, 21, 3, 13, 8, 7, 4, 11]
    print('--------end---',arr)
    # 將最大的放到堆的最后一個, 堆-1, 繼續(xù)調整排序
    for end in range(len(arr) -1, 0, -1):
        arr[0], arr[end] = arr[end], arr[0]
        sift_down(arr, 0, end - 1)
        

    
array = [16,9,21,13,4,11,3,22,8,7,15,29]
print(array)
heap_sort(array)
print(array)

三绢陌、Leetcode編程練習

題目:239 滑動窗口最大值
給定一個數組 nums,有一個大小為 k 的滑動窗口從數組的最左側移動到數組的最右側熔恢。你只可以看到在滑動窗口 k 內的數字脐湾。滑動窗口每次只向右移動一位叙淌。
返回滑動窗口最大值秤掌。

示例:

輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
輸出: [3,3,5,5,6,7] 
解釋: 

  滑動窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

注意:

你可以假設 k 總是有效的,1 ≤ k ≤ 輸入數組的大小鹰霍,且輸入數組不為空闻鉴。

思路:

  1. 每次入隊如果新元素比隊尾元素小,則將其刪除茂洒,直至隊尾元素大于新元素或隊內無元素孟岛。(因為被刪除元素既沒有當前元素大,也沒有當前元素新督勺,所以肯定不會替代當前元素成為最大值的)
  2. 找最大值時從隊頭開始渠羞,如果隊頭元素對應的index不在當前窗口則將其刪除,直到找到在窗口中的元素智哀,即為最大值次询。

代碼:

class Solution:
    def maxSlidingWindow(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        if len(nums) == 0:
            return []
        if k == 0:
            return nums
        from collections import deque
        deq = deque()
        res = []
        L = len(nums)
        for i in range(L):
            while deq and nums[i] > nums[deq[-1]]:
                deq.pop()
            deq.append(i)
            
            if deq[0] < i - k + 1:
                deq.popleft()

            if i >= k - 1:
                res.append(nums[deq[0]])
        return res

運行結果:


參考內容:

https://blog.csdn.net/PKU_Jade/article/details/77934644
http://python.jobbole.com/85264/
https://www.cnblogs.com/linxiyue/p/3556875.html
http://blog.51cto.com/sevenot/2059588
http://python.jobbole.com/87577/
http://www.reibang.com/p/d174f1862601
http://www.cnblogs.com/terry-c/p/9864994.html
https://www.cnblogs.com/NewsunLs/p/9568126.html
https://www.cnblogs.com/chengxiao/p/6129630.html
https://blog.csdn.net/dujiahaogod/article/details/79688331

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓷叫,隨后出現的幾起案子屯吊,更是在濱河造成了極大的恐慌,老刑警劉巖摹菠,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盒卸,死亡現場離奇詭異,居然都是意外死亡辨嗽,警方通過查閱死者的電腦和手機世落,發(fā)現死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糟需,“玉大人屉佳,你說我怎么就攤上這事≈扪海” “怎么了武花?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長杈帐。 經常有香客問我体箕,道長,這世上最難降的妖魔是什么挑童? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任累铅,我火速辦了婚禮,結果婚禮上站叼,老公的妹妹穿的比我還像新娘娃兽。我一直安慰自己,他們只是感情好尽楔,可當我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布投储。 她就那樣靜靜地躺著,像睡著了一般阔馋。 火紅的嫁衣襯著肌膚如雪玛荞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天呕寝,我揣著相機與錄音勋眯,去河邊找鬼。 笑死下梢,一個胖子當著我的面吹牛客蹋,可吹牛的內容都是我干的。 我是一名探鬼主播怔球,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼嚼酝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竟坛?” 一聲冷哼從身側響起闽巩,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎担汤,沒想到半個月后涎跨,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡崭歧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年隅很,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片率碾。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡叔营,死狀恐怖屋彪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情绒尊,我是刑警寧澤畜挥,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站婴谱,受9級特大地震影響蟹但,放射性物質發(fā)生泄漏。R本人自食惡果不足惜谭羔,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一华糖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘟裸,春花似錦客叉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至超棺,卻和暖如春向族,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棠绘。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工件相, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氧苍。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓夜矗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親让虐。 傳聞我的和親對象是個殘疾皇子紊撕,可洞房花燭夜當晚...
    茶點故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,093評論 1 32
  • 1 初級排序算法 排序算法關注的主要是重新排列數組元素,其中每個元素都有一個主鍵赡突。排序算法是將所有元素主鍵按某種方...
    深度沉迷學習閱讀 1,397評論 0 1
  • 一些概念 數據結構就是研究數據的邏輯結構和物理結構以及它們之間相互關系对扶,并對這種結構定義相應的運算,而且確保經過這...
    Winterfell_Z閱讀 5,710評論 0 13
  • 1)這本書為什么值得看: Python語言描述惭缰,如果學的Python用這本書學數據結構更合適 2016年出版浪南,內容...
    孫懷闊閱讀 12,458評論 0 15
  • 借助紙片的途徑 我們試圖建立蒲公英的影子 這些具備強大的繁殖功能信物 一直被為之崇尚 就像我們崇尚神明的強大 帶來...
    __叫烏鴉的少年閱讀 161評論 0 4