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

0 評論 316 瀏覽 2 收藏 11 分鐘

在生活中,其實我們可以應用到不少算法思想,這篇文章里,作者就介紹了“優先級隊列算法”可以如何應用于我們的生活,一起來看看吧。

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

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

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

原理:

優先級隊列的核心原理是采用某種數據結構(如堆、平衡二叉搜索樹等)來維護元素的排序。每次插入元素時,都會根據優先級調整隊列結構;每次刪除(或訪問)元素時,返回并移除的是當前優先級最高的元素。

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

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

二叉堆是一種常見的實現方式,因為堆可以在對數時間內完成插入和刪除最大(或最?。┰氐牟僮鳎瑫r它的靈活性也比較高,可以根據具體的需求定義優先級的比較方式,廣泛適用于各種需要考慮優先級的場景中。當然,相對于基本隊列,優先級隊列的實現也更為復雜一些,尤其是在維護堆的性質時。

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

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

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

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

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

那在生活中,我們很多地方都可以應用“優先級隊列算法”的思路,比如產品需求很多,一個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 協議

該文觀點僅代表作者本人,人人都是產品經理平臺僅提供信息存儲空間服務。

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 目前還沒評論,等你發揮!