数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
時間效率
- 互聯網想對時間效率格外的敏感,所以我們總是在需求迭代一定程度后去做優化。而且我們解決問題的時候,時間效率往往是一個考查的重點。因此我們平時編碼過程中就必須不斷的優化效率,追求完美的態度與能力。
- 首先是編碼習慣,例如java中字符串操作我們不建議使用String的+ 運算符來完成。這樣會產生非常多的String臨時變量,造成空間與實際的浪費,更好的方式是用StringBuilder的Append方法完成字符串的拼接。
- 其次,即使是同一個算法用循環和遞歸兩種思路實現時間效率也是不一樣的。遞歸的本質是吧一個大的復雜問題拆解成兩個或者多個小的簡單問題,如果小問題中互相重疊,那么直接用遞歸實現,代碼會更加簡單,但是時間效率非常差,這時候,我們可以用遞歸的思路來分析,但是用數組(一維數組或者二維數組)來保存中間結果基于循環實現。絕大部分動態規劃算法的分析和代碼實現都是分這兩個步驟。
- 再次,代碼時間效率還體現在我們數據結構的掌握程度。
- 最后以如下提來舉例:
數組中出現次數超過一半的數字
-
數組中有一個數字出現的次數超過數組長度的一半,找出這個數字,例如:輸入一個長度為10 的數組{1,2,3,3,3,3,3,3,4,5,6,7}。由于數組3在數組中出現了6次,超過數組長度的一半因此輸出3
-
解法一:看到題目的第一反應就是講數組排序統計,自然很容易得出每個數字的次數。題目給出的數組沒說排序
- 先排序。排序的時間復雜度O(nlogn)
- 接著統計O(n)
- 最直觀的算法通常不是最優解,我們接著找更優的解法
-
解法二:題意中是一個特殊的數組,數組中有一個數字出現次數超過數組長度的一半。排序后,不管其中重復的數字怎么排,其中位于數組中間位置的數字比如就是出現超過一半的那個數字。
- 結論是我們需要找的就是統計學中的中位數。即長度為n 的數組,找出第n/2 大的數字,這個有成熟的O(N)算法得到數組中第K個大的數
-
分析:
- 我們在之前的排序算法文章:數據結構與算法–排序算法總結(動圖演示) 對各種排序算法有詳細的解釋。根據快排的思路,我們先選擇數組中一個隨機的數字,然后調整數組中數字順序,使得左邊小,右邊大。如果這個數字的下標正好是n/2,那么得到我們的結果
- 如果下標大于n/2,那么中位數在 左邊,則同樣的算法用在左邊的數列上
- 如果下標小于n/2,那么中位數在右邊,則同樣的算法用在作右邊的數列上
- 典型的遞歸
-
經過如上分析有如下代碼:
-
以上解法時間復雜度能達到O(n),但是還是有點復雜的,可能你寫不出來,是否有更簡單的方法?
-
解法三:依然分析數組的特性,超過一半的存有量,也就是他比他的數字出現的次數的總和還要多,
- 那么我們只需要統計個數就能得到了
- 只進行一次遍歷數組,保存兩個值,一個數組中數字,一個他的次數
- 如果遍歷到下一個數據的時候,還是這個數,那么次數加 +1,否則次數 -1
- 如果次數達到0 ,那么情況保存的這個數,在接著遍歷依然用以上邏輯
- 由于我們要找的數據出現的次數比其他數字總和還要多,那么肯定最后一個保存下來的數據必然是我們要的那個出現此處過半的數據。
-
根據如上分析有如下代碼:
- 如上第二第三都是最優解,但是第二中修改了數組,第三種沒有修改數組,可以依據具體情況來決定方案。
上一篇:數據結構與算法-- 八皇后問題(兩種實現方案)
下一篇:數據結構與算法–將數組排成最小的數
總結
以上是生活随笔為你收集整理的数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spss秩和检验操作
- 下一篇: 为什么led全彩显示屏闪烁及解决方案le