【问题标题】:Frequency of an Array using Hashmaps and Objects [duplicate]使用哈希图和对象的数组频率[重复]
【发布时间】:2020-10-11 03:40:23
【问题描述】:

如您所见,我正在尝试使用哈希图和对象分析给定数组中哪个值出现频率最高。如果可以,请尝试找出每种算法的答案(哈希图和对象)。

下面的示例使用哈希映射来“映射”各种对象。但是,我有两个问题: 1. 我不能正确地增加出现次数:在出现变量等于 1 之后,该值将永远保持,因此算法提供了错误的模式。 2.我不知道如何在迭代完成后更改地图的值。

var highestFrequency = (array) => {
  var occurenceStored = new Map();
  let occurrence = 0;
  for (var i = 0; i < array.length; i++){
    var j = i + 1;
    if (array[i] === array[j]){
      occurrence += 1;
      occurenceStored.set(array[i], occurrence)
    }
  }

  console.log(occurenceStored);
}


highestFrequency([101, 104, 108, 108, 111, 119, 119, 119])

我决定不使用哈希图,而是使用对象,但我遇到了同样的问题。出现变量永久等于 1。我尝试在不同的地方声明出现变量,但似乎找不到正确的修复方法。

var highestFrequency = (array) => {
  var occurenceStored = {};
  let occurrence = 1;
  for (var i = 0; i < array.length; i++){
    var j = i + 1;
    if (array[i] === array[j]){
      occurenceStored[array[i]] = occurrence;
    }
  }

  console.log(occurenceStored);
}


highestFrequency([101, 104, 108, 108, 111, 119, 119, 119, 120, 120, 120])

【问题讨论】:

  • reduce 方法来做这件事怎么样? array.reduce((a, e)=&gt;(a[e] = a[e] || 0, a[e]++, a),{})

标签: javascript


【解决方案1】:

使用Object方式,可以实现如下:

var highestFrequency = (array) => {
  var occurenceStored = {};
  for (var i = 0; i < array.length; i++){
    
    if (occurenceStored[array[i]]){
      occurenceStored[array[i]] = occurenceStored[array[i]]+1;
    } else{
        occurenceStored[array[i]]=1;
    }
  }

  console.log(occurenceStored);
}

【讨论】:

    【解决方案2】:

    如果你需要使用地图,那么你可以这样做:

    const highestFreq = (array) => {
      let myMap = new Map();
      for( let i = 0; i < array.length; i++ ) {
        if (myMap[array[i]]) myMap[array[i]]++;
        else myMap[array[i]] = 1; 
      }
      return myMap;
    }
    
    const myArray = [101, 104, 108, 108, 111, 119, 119, 119];
    
    const myMap = highestFreq(myArray);
    console.log(myMap); 

    myMap 包含键值对,其中键是给定数组中的唯一元素,映射值是它们的出现次数。

    【讨论】:

      【解决方案3】:

      假设您只想要最频繁的值(如果有两个具有相同频率的不同值怎么办?):

      • 每个值增加一个计数器
      • 迭代时,如果计数器大于您的最大计数器,则改为最大。
      const highestFreq = arr => {
        const best = { value: 0, n: 0 } // what to do if empty array ??
        arr.reduce((m, el) => {
          const counter = (m.get(el) || 0) + 1
          if (counter > best.n) {
            best.value = el
            best.n = counter
          }
          return m.set(el, counter)
        }, new Map())
        return best // or compute your frequency: best.n / arr.length
      }
      
      console.log(highestFreq([101, 104, 108, 108, 111, 119, 119, 119]))
      

      【讨论】:

        猜你喜欢
        • 2020-08-05
        • 1970-01-01
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 2015-06-09
        • 2018-12-04
        • 2018-04-04
        • 2023-03-25
        相关资源
        最近更新 更多