【數據結構 03】數據處理的基本操作——增刪查

在上一篇:代碼優化方法論02】選擇合適的數據結構——將昂貴的“時間”轉換爲廉價的“空間” 中,我們學習了時空轉換的思想,而它的核心就是選擇合適的數據結構,將時間複雜度向空間複雜度轉換。那麼該如何選擇合適的數據結構呢?

要想靈活使用數據結構,你需要先弄清楚數據在代碼中被處理、加工的最小單位動作,也就是數據結構的基本操作,有了這些動作之後,你就可以基於此去選擇更合適的數據結構了。

1. 舉個栗子:代碼對數據處理

例1:查找出一個數組中,出現次數最多的那個元素的數值。例如,輸入數組 a = [1,6,3,5,5,5,6 ] 中,查找出現次數最多的數值。

上面這個例子我們在上一篇:【代碼優化方法論 02】 中分析過。使用字典的數據結構能使時間複雜度降低到O(n),那究竟是什麼讓我們選擇字典呢?下面仔細來聊一聊。

我們先看一下這個任務需要對數據進行哪些操作。我們在解這個題時,核心思路應該是:

  • 第一步,根據原始數組計算每個元素出現的次數;
  • 第二步,根據第一步的結果,找到出現次數最多的元素。

對於上面的第一步,可以提取出的基本數據操作有:

  • 查找: 看能否在數據結構中查找到這個元素,也就是判斷元素是否出現過。
  • 新增: 針對沒有出現過的情況,新增這個元素。
  • 改動: 針對出現過的情況,需要對這個元素出現的次數加 1。

對於上面的第二步,可以提取出的基本數據操作有:

  • 查找:訪問數據結構中的每個元素,找到次數最多的元素。

由此可見,本任務會重複使用到查找。而能在 O(1) 的時間複雜度內完成查找動作的數據結構,只有字典類型。因此選擇字典結構可能會比其他數據結構效率更高,事實也是如此。
注:此題解法可參考:【代碼優化方法論 02】

2. 數據處理的基本操作

設計合理的數據結構,要從問題本身出發,我們可以採用這樣的思考順序

  1. 分析這段代碼到底對數據先後進行了哪些操作。
  2. 根據分析出來的數據操作,找到合理的數據結構。

這樣我們就把數據處理的基本操作梳理了出來。今後,即使你遇到更復雜的問題,無非就是這些基本操作的疊加和組合。只要按照上述的邏輯進行思考,就可以輕鬆設計出合理的數據結構。

數據處理的操作就是找到需要處理的數據,計算結果,再把結果保存下來。這個過程總結爲以下操作:

  • 找到要處理的數據。這就是按照某些條件進行查找。
  • 把結果存到一個新的內存空間中。這就是在現有數據上進行新增。
  • 把結果存到一個已使用的內存空間中。這需要先刪除內存空間中的已有數據,再新增新的數據。

3. 方法論

經過對問題的拆解,你會發現即便是很複雜的代碼,它對數據的處理也只有這 3 個基本操作,增、刪、查。只要圍繞這 3 個數據處理的操作進行分析,就能選擇出合適的方案。總結下來,我們在思考代碼優化時,可以從以下三個問題入手:

  1. 這段代碼對數據進行了哪些操作?
  2. 這些操作中,哪個操作最影響效率,對時間複雜度的損耗最大?
  3. 哪種數據結構最能幫助你提高數據操作的使用效率?

對於前面兩個問題,圍繞數據處理的基本操作,這可以通過刷題加深我們的理解。對於第3個問題,就需要我們去掌握相應的數據結構基礎知識,這個我在後面也會逐漸整理出來。


參考鏈接:https://kaiwu.lagou.com/course/courseInfo.htm?courseId=185#/detail/pc?id=3341

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章