JavaScript 陣列元素頻率計數程式
計數頻率意味著我們需要統計給定陣列中每個元素出現的次數。我們可以使用一些內建的資料結構,例如對映(maps),來獲取頻率,或者也可以對陣列進行排序來獲取陣列元素的頻率。我們將討論這兩種方法,讓我們逐一瞭解它們。
陣列排序
在這種方法中,我們將對陣列進行排序,並檢查當前元素是否與前一個元素相同。如果當前元素與前一個元素不同,則這是一個新元素,前一個元素的頻率為計數變數的值,我們將使用此變數來增加元素的計數。
方法
首先,我們將使用內建的 sort 方法對陣列進行排序。
我們將建立一個數組,用於儲存陣列中元素及其相應的頻率。
我們將建立一個變數“count”來儲存當前元素出現的次數。
我們將遍歷陣列,並在每次迭代中,檢查當前元素是否等於前一個元素。
如果當前元素等於前一個元素,則我們將增加 count 的值。
如果當前元素不等於前一個元素,則我們將 count 與前一個元素作為鍵值對儲存在陣列中,表示當前元素的頻率。
此外,我們將 count 的值更新為 1。
遍歷完陣列後,我們將儲存排序陣列最後一個元素的頻率,因為它不會被儲存,並且迴圈已結束。
示例
讓我們看看實現上述方法的程式碼,並以更好的方式新增和理解它。
// given array
var arr = [ 1, 4, 5, 6, 2, 2, 2, 4, 5, 5, 4, 6, 9, 1, 2, 2, 3]
// sorting the array
arr.sort()
var count = 1
for(var i = 1;i<arr.length; i++){
if(arr[i] == arr[i-1]) {
count++;
}
else {
console.log("The frequency of "+ arr[i-1] + " is: " + count);
count = 1;
}
}
console.log("The frequency of "+ arr[arr.length-1] + " is: " + count);
時間和空間複雜度
上述程式碼的時間複雜度為 O(N*log(N)),因為我們對陣列進行了排序,排序的時間複雜度為 N*log(N),並且我們遍歷了陣列一次,時間複雜度為 O(N),其中 N 是給定陣列中存在的元素數量。
上述程式碼的空間複雜度為 O(1),因為我們沒有使用任何額外的空間,但是如果我們想要儲存頻率,則會有一些額外的空間,空間複雜度為 O(N)。
使用對映查詢所有元素的頻率
對映是將值以鍵值對形式儲存的資料結構,並且資料可以在以後更新。在對映中新增或更新資料需要對數時間,但無需對陣列進行排序,這意味著我們不必像在前面的程式中那樣更改陣列。讓我們首先了解一下方法,然後我們將進入編碼部分。
方法
首先,我們將使用 new 關鍵字建立對映。
我們將遍歷陣列,並對每個元素進行檢查。
如果當前元素存在於對映中,則我們將增加為當前元素儲存的值(即頻率)。
如果元素未儲存,則我們將它作為鍵新增到對映中,並將其值設定為 1。
遍歷完陣列後,我們可以將對映中儲存的值作為鍵值對打印出來。
示例
我們已經瞭解了程式碼的方法,現在讓我們進入實現部分,以便更好地理解程式碼。
// given array
var arr = [ 1, 4, 5, 6, 2, 2, 2, 4, 5, 5, 4, 6, 9, 1, 2, 2, 3]
var map = new Map()
for(var i = 0;i<arr.length; i++){
if(map.has(arr[i])){
var k = map.get(arr[i]);
map.delete(arr[i]);
map.set(arr[i],k+1)
}
else{
map.set(arr[i],1);
}
}
console.log(map)
時間和空間複雜度
上述程式碼的時間複雜度為 O(N*log(N)),其中 N 是陣列的大小,對數因子是由於對映的工作原理造成的。上述程式碼的空間複雜度為 O(N),這是儲存對映中元素所需的。
使用對映查詢頻率很好,因為我們不必更改給定的陣列。
結論
在本教程中,我們學習了 JavaScript 陣列元素頻率計數程式。計數頻率意味著我們需要統計給定陣列中每個元素出現的次數。我們已經瞭解了兩種解決此問題的方法:一種是使用內建的 sort 函式對元素進行排序,另一種是使用內建的 map 資料結構。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP