排序數列中元素出現次數問題

2021-12-29 21:42:28 字數 2172 閱讀 6754

於「排序數列中元素出現次數問題」,這裡採用折半法給出兩種思路:

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...