於「排序數列中元素出現次數問題」,這裡採用折半法給出兩種思路:
1、找到元素在陣列中的乙個索引位置,由於是陣列是有序排列,所有在這個位置左右移動,就可以找出其所有出現的位置;
2、通過折半法找到元素的最大索引位置與最小索引位置,然後兩個索引位置相減再加一,就是元素的出現的次數。
方法1中查詢元素位置的方法複雜度為o(logn),左右遍歷元素的複雜度為o(n),所以總的複雜度為o(logn) + k,其中k為元素出現的次數。
當n小,k大時不太適合用這種方法。
方法2中時間複雜度為o(logn),但是進行了兩次查詢,若n較大時也是乙個不小的開。所以當n大,k小時,不太適合用這種方法。
方法1的php**實現
/** @function:折半查詢順序陣列中元素出現的位置
* @param:順序排列的陣列
* @param:要查詢的元素
* @param: true 查詢最大位置, false查詢最小位置
* @return:返回元素的位置索引,沒有返回零
*/function arr_index_value($arr, $num, $flag)else if($arr[$mid] < $num)else
//若$flag為假,獲得最小索引位置
else}}
} 方法2的php**實現:
/** @function:折半查詢有序陣列中某元素出現的次數。
* 思路:分別找到元素在陣列**現的最大索引位置與最小索引位置,
* 然後兩個相減,再加一就是出現的次數。
* @param:順序排列的有序陣列
* @param:需要查詢的元素
* @return:元素出現的次數,若不存在則返回零
*/function arr_count_values2($arr, $num)
/* * @function:折半查詢順序陣列中元素出現的位置
* @param:順序排列的陣列
* @param:要查詢的元素
* @param: true 查詢最大位置, false查詢最小位置
* @return:返回元素的位置索引,沒有返回零
*/function arr_index_value($arr, $num, $flag)else if($arr[$mid] < $num)else
//若$flag為真,獲得最大索引位置
else}}
}//測試
$a = array(1, 2, 2, 2, 3, 3, 5, 8);
print arr_count_values2($a, 2);
我們可以進一步優化方法2,減少一次折半過程,使得時間複雜度進一步減小。
方法3的php實現**:
/** @function:折半查詢有序陣列中某元素出現的次數。
* 思路:分別找到元素在陣列**現的最大索引位置與最小索引位置,
* 然後兩個相減,再加一就是出現的次數。
* @param:順序排列的有序陣列
* @param:需要查詢的元素
* @return:元素出現的次數,若不存在則返回零
*/function arr_count_values3($arr, $num)else if($arr[$mid] < $num)else
}if($left > $right) return 0;
$mid_t = $mid;
$left_t = $left;
$right_t = $right;
//折半法獲得最小索引位置
while($left <= $right)
$right = $mid - 1;
}//折半法獲得最大索引位置
while($left_t <= $right_t)
$left_t = $mid_t + 1;
}//元素出現次數 = 最大索引位置 - 最小索引位置 + 1
$max = arr_index_value($arr, $num, true);
$min =arr_index_value($arr, $num, false);
return $max - $min + 1;
} 可見,方法3是最優的解法,適合各種情況,尤其在陣列很大,元素出現的次數較多時,更能體現其優勢
Python統計數列中元素出現的次數並進行排序
輸入 list,例如 d f g f e z f a a 輸出 list,統計每個元素出現的次數,並按照從高到低的順序排序,例如 f 3 a 2 d 1 g 1 e 1 z 1 count 方法用於統計字串裡某個字元出現的次數。可選引數為在字串搜尋的開始與結束位置。sorted 函式對所有可迭代的物...
Python 統計序列中元素出現次數
import sys import random from collections import counter reload sys sys.setdefaultencoding utf 8 data list random.randint 1,20 for in range 10 從1 20隨機...
序列中元素出現次數最多
1 2 序列中元素出現次數最多34 5 from random import randint 6from collections import counter7 隨機生成乙個序列在0 20之間生成30個元素 8 data randint 0,20 for in range 30 9print dat...