JavaScript 计算数组元素的频率
计算频率意味着我们要计算数组中一个元素在给定数组中出现的次数。我们可以使用一些内置的数据结构比如映射来获取频率,也可以对数组进行排序以获取数组元素的频率。我们将讨论这两种方法,让我们逐个看看它们。
对数组进行排序
在这种方法中,我们将对数组进行排序,并检查当前元素是否与前一个元素相同,如果不相同,则当前元素是新元素,并且前一个元素的频率是一个变量count,我们将使用它来增加元素的计数。
方法
- 首先,我们将使用内置的sort方法对数组进行排序。
-
我们将创建一个数组,用于存储给定数组中元素及其相应的频率。
-
我们将创建一个变量’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(Nlog(N)),因为我们对数组进行了排序,并且排序的时间复杂度是Nlog(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是数组的大小,log是由于map的运行造成的因子。上述代码的空间复杂度为O(N),需要用来存储map中的元素。
使用map来查找频率是很好的,因为我们不需要改变给定的数组。
结论
在本教程中,我们介绍了JavaScript程序来计算数组元素的频率。计算频率意味着我们需要计算给定数组中某个元素出现的次数。我们看到了两种解决这个问题的方法,一种是使用内置的排序函数对元素进行排序,另一种是使用内置的map数据结构进行处理。