天天看點

算法人生(12):從“優先級隊列算法”到“六點優先工作法”

作者:人人都是産品經理
在生活中,其實我們可以應用到不少算法思想,這篇文章裡,作者就介紹了“優先級隊列算法”可以如何應用于我們的生活,一起來看看吧。
算法人生(12):從“優先級隊列算法”到“六點優先工作法”

算法思想和生活中很多解決問題的思想有着異曲同工之妙,讓我們來看下今天的“優先級隊列算法”可以怎麼應用到我們的生活中吧!

優先級隊列算法(Priority Queue Algorithm) 是一種特殊的資料結構,它在正常隊列秉持着“先進先出”的原則,并且增加了一個“元素優先級”的概念。這意味着隊列中的元素不僅按照進入的順序排列,還會根據它們各自的優先級來決定出隊的順序。

隊列中的元素可以是任何類型,隻要它們可以比較優先級即可。優先級隊列中的元素通常帶有與其關聯的優先級辨別,優先級較高的元素總是位于隊列前面,優先被處理。它的工作原理如下:

原理:

優先級隊列的核心原理是采用某種資料結構(如堆、平衡二叉搜尋樹等)來維護元素的排序。每次插入元素時,都會根據優先級調整隊列結構;每次删除(或通路)元素時,傳回并移除的是目前優先級最高的元素。

以二叉堆為基礎的優先級隊列為例,其基本操作包括:

  1. 初始化:建立一個空的優先級隊列(通常是空的數組或清單)。
  2. 插入:當新元素加入時,将其放置在數組的末尾,然後通過“上濾”過程調整堆結構,以維持最大堆的性質(通常使用最大堆)。
  3. 删除:移除并傳回優先級最高的元素(即堆頂元素),然後将數組的最後一個元素移動到堆頂,并通過“下濾”過程調整堆結構,保持最大堆性質。
  4. 查找最高優先級元素:直接通路堆頂元素即可。
  5. 判斷隊列是否為空:檢查堆的大小。

二叉堆是一種常見的實作方式,因為堆可以在對數時間内完成插入和删除最大(或最小)元素的操作,同時它的靈活性也比較高,可以根據具體的需求定義優先級的比較方式,廣泛适用于各種需要考慮優先級的場景中。當然,相對于基本隊列,優先級隊列的實作也更為複雜一些,尤其是在維護堆的性質時。

從以上可以看出,面對複雜的問題是,即便“維護堆”可能會相對複雜些,需要去設定規則處理優先級元素的處理順序。但是相對于“沒有重點,眉毛胡子一把抓”的解決方案,“優先級隊列算法”更能保證最高優先級的問題能夠在最快的時間内得到解決,是在“有限時間裡盡可能的做到最好的一種思路”。

熟悉MBA考試的同學會有些取舍的感觸,考MBA的試卷或許沒有特别複雜,但是考試時長是大家非常頭疼的問題,時間看上去很長,但沒做多久就要交卷了!是以很多考生一出來都說試卷沒有做完。

筆者特地針對這個問題去查了下原因,理由是MBA考的是綜合能力,根據自己的情況有效地“取舍”,進而完成目标也是考試的一項驗證标準。

是以先做哪些題目,後做哪些題目都有着講究,通常情況下要先做寫作題(因為據說寫作沒有寫完,此項就沒有分),然後做選擇題,碰到題不會的或耗時過長的,要趕緊“過”,不可“戀戰”,先把能快速答出來的問題先做完,如果還有時間再回來看這些需要些“思考時間“的題目。

同時心态上,不能因為一直碰到無法快速答出的題目就心态受影響,要先保證所有熟練掌握的題目都有被回答到。“根據目前的情況,謹記自己的目标,有效取舍”才可能完成目标。

那在生活中,我們很多地方都可以應用“優先級隊列算法”的思路,比如産品需求很多,一個sprint或許完不成,又或者突發情況出現,必須要先保“一個産出”,定産品的優先級順序就非常重要。此外,當代IT人一大頭疼的問題“工作生活沒法平衡,加班太多沒有自己個人的時間”,這些問題也需要我們個人學習如何應用“優先級思維”到生活中。

這裡介紹一個同樣應用“優先級”思維的工作方法:“六點優先工作制”。

“六點優先工作制”是一種由效率專家艾維·李(Avery C. Lee)提出的高效時間管理方法,它強調每天确定并優先處理六項最重要的任務,以提升工作效率和成果産出。它強調将注意力集中在少數幾個最關鍵的任務上,而不是試圖完成長長的待辦事項清單。這種方法認為,每天專注于完成最重要的六項任務,可以有效防止工作日的瑣事分散注意力,提高個人生産力。這種方法對應的大概步驟如下:

  1. 列出任務:在每一天結束時或新的一天開始時,列出所有需要完成的任務。
  2. 評估任務:對每個任務進行評估,考慮其緊急程度、重要性、截止日期等因素。通常情況下,重要度的考量會更高些,根據具體的事情可調,看個人情況。
  3. 優先級排序:從所有任務中挑選出六個“目前”最重要的任務,按優先級從高到低編号為1至6。
  4. 執行任務:按照編号順序逐個完成任務,先完成1号任務,然後是2号任務,依此類推,直至完成六個任務為止。通常情況下,建議一次隻完成一個任務,因為一次隻做一件事比較容易進入“心流”,進入心流的好處不止可以提高做事的效率,也可以讓現代人“散亂”的心漸漸收回來,心靜了,智慧就出來了。如果很想一次做兩件甚至以上的事情,筆者建議這些同步進行的事情是對個人來說,用到的是不同的“力”,比如有的事情用的更多的是體力(比如幹家務,走路),有的事情用的更多是聽力(幹家務、走路時聽個學習的課程)。此處隻列大概的思路,大家根據情況可自行調整。
  5. 複盤與調整:在每天結束時或第二天開始時,回顧任務完成情況,對未完成的任務進行重新評估和優先級排序。

其實這個方法,跟産品經理評估、優化需求時的方法,也是異曲同工的,需求那麼多,總要考慮場景,目标,痛點,方案,成本等來對需求進行排序,需求做好了之後,也要根據實際情況進行調整、優化。它的主要思想還是“精力是有限的”,不管是個人還是團隊都是有限的(加上市場機會是不等人的),是以把有限的精力放在最重要的事情上,才可能讓個人或團隊找到“可以行走江湖的刷子”。

下面以程式員同學的生活為例來拓展下應用思路:

  1. 任務清單:程式員可以在項目管理工具或紙質筆記本上列出每天需要完成的各項開發任務、代碼稽核、文檔編寫等。
  2. 優先級分析:考慮任務對項目的影響程度、截止日期的臨近程度、與其他團隊成員的依賴關系等因素來确定優先級。
  3. 聚焦關鍵任務:程式員在工作時應首先關注優先級最高的任務,如修複嚴重影響使用者體驗的Bug、完成關鍵功能子產品的開發,或者某個别人急等的技術文檔。
  4. 時間分割:可以将每天的工作時間劃分為幾個時段,每個時段專注于完成一個優先級高的任務。
  5. 靈活調整:程式員在工作中難免會遇到突發事件(bug)或優先級發生變化(需求變更)的情況,這時應及時調整任務清單,重新排列優先級,確定始終抓住目前階段的工作重點。

在應用“六點優先工作制”,筆者建議也不拘泥于數字“6”,不一定非要六項優先級最高的,可以前面5項,前3項,但最好不要超過6(雜事但必須做的可以歸類到一個時間點,統一處理),免得所有的任務都變得重要了,這個數字大家根據自己的情況自行調整。

“優先級”思維可以讓我們從繁瑣雜亂的思緒中走出來,關注在最重要的、最具影響的事情上,有點“擒賊先擒王”的意思。希望這可以給大家“走出”工作生活不平衡帶來一定啟發,如果你也有更好的方法,歡迎分享交流!

本文由 @養心進行時 原創釋出于人人都是産品經理,未經許可,禁止轉載

題圖來自Unsplash,基于 CC0 協定

該文觀點僅代表作者本人,人人都是産品經理平台僅提供資訊存儲空間服務。

繼續閱讀