【问题标题】:Find the mode (most frequent value in an array) using a simple for loop?使用简单的 for 循环查找模式(数组中最常见的值)?
【发布时间】:2011-10-31 18:53:15
【问题描述】:

如何使用简单的 for 循环找到模式(数组中最常见的值)?

代码编译时输出错误。

这是我所拥有的:

public static void mode(double [] arr)
{
    double mode=arr[0];

    for(int i = 1; i<arr.length; i++)
    {   
        if(mode==arr[i])
        {
            mode++;
        }

     }


    return mode;
}

【问题讨论】:

    标签: java arrays methods mode


    【解决方案1】:

    首先我按顺序对数组进行排序,然后计算一个数字的出现次数。只有循环和 if 语句没有哈希图。

    我的代码:

    static int Mode(int[] n){
        int t = 0;
        for(int i=0; i<n.length; i++){
            for(int j=1; j<n.length-i; j++){
                if(n[j-1] > n[j]){
                    t = n[j-1];
                    n[j-1] = n[j];
                    n[j] = t;
                }
            }
        }
    
        int mode = n[0];
        int temp = 1;
        int temp2 = 1;
        for(int i=1;i<n.length;i++){
            if(n[i-1] == n[i]){
                temp++;
            }
            else {
                temp = 1;
            }
            if(temp >= temp2){
                mode = n[i];
                temp2 = temp;
            }
        }
        return mode;
    }
    

    【讨论】:

    • 如果需要双数组,只需将 int[] 更改为 double[]
    【解决方案2】:

    -只需使用包含数组索引值作为键和它们的出现次数作为值的 HashMap。

    -通过检查当前索引是否已存在于 HashMap 中,在遍历 for 循环时更新 HashMap。如果确实如此,则在哈希映射中找到该双精度,并查看它已经出现了多少次,然后将其放回哈希映射中,再出现一次。

    -我是用 Java 做的,因为它看起来就像你正在使用的那样。还有一个好处是时间复杂度是 O(n),这是你在这种情况下可能得到的最好的,因为你必须至少访问每个元素一次。

    -所以如果你有一个这样的双精度数组:{ 1,2,3,1,1,1,5,5,5,7,7,7,7,7,7,7,7, 7} 然后哈希图最后看起来像这样: { 1->4, 2->1, 3->1, 5->3, 7->9 } 意思是“1 发生了 4 次,2 发生了 1 次……7 发生了 9 次”等等。

        public static double mode(double [] arr)
        {
            HashMap arrayVals = new HashMap();
            int maxOccurences = 1;
            double mode = arr[0];
    
            for(int i = 0; i<arr.length; i++)
            {   
                double currentIndexVal = arr[i];
                if(arrayVals.containsKey(currentIndexVal)){
                    int currentOccurencesNum = (Integer) arrayVals.get(currentIndexVal);
                    currentOccurencesNum++;
                    arrayVals.put(currentIndexVal, currentOccurencesNum );
                    if(currentOccurencesNum >= maxOccurences)
                    {
                        mode = currentIndexVal;
                        maxOccurences = currentOccurencesNum;
                    }
                }
                else{
                    arrayVals.put(arr[i], 1);
                }
            }
    
    
            return mode;
        }
    

    【讨论】:

    • 感谢您的回复。我能够使用 for 循环来解决这个问题。
    • 公共静态双模式(double [] arr) { double loc = 0, val = -1; for(int i = 1; iloc) { val= arr[i];位置=计数; } } { } 返回值;
    • 是的 jlss4e 你的肯定有效,但由于嵌套的 for 循环,它必须将每个元素与它看起来的每个其他元素进行比较。所以它必须运行 n*(n-1) 次。因此,如果有 100 个输入,它必须运行 100*99 次。如果您不担心性能,它似乎很完美 =-)
    • 是的,我是编程新手,还没有学习过 Hashmaps。
    • 是的,一定要用你最喜欢的语言学习 HashMap。我希望在我刚开始的时候更多地使用它们。这可能是将键值信息存储在一个列表中而无需创建对象的最简单方法。比如姓名和电话号码列表等。
    【解决方案3】:

    此代码是不使用哈希图的不同方式。这个在 java 中创建的方法以一个数组作为参数,并在该方法中创建另一个名为“numberCount”的数组。此数组“numberCount”将其索引设置为数组中的值。包含传递数组中的值的“numberCount”索引将“numberCount”的值(“++numberCount[array[i]]”)加1,然后将转到数组中的下一个值(重复直到数组的末尾)。然后创建另一个 for 循环来遍历“numberCount”中数组的每个值,具有最高值/计数的索引将被存储并返回为“max”。此方法必须进行一些困难的更改才能使用双数组。但似乎适用于 int 数组。

    public static int findMostFrequentValue(int[] array) {
        int i;
        int[] numberCount = new int[100];
        for (i = 0; i < array.length; i++)++numberCount[array[i]];
        int max = 0;
        int j;
    
        for (j = 0; j < numberCount.length; j++) {
            if (numberCount[j] > max) max = j;
        }
        return max;
    }
    

    【讨论】:

      【解决方案4】:

      您应该检查数组中每个元素的出现次数。您可以通过 2 个内部 for 循环将数组的每个元素与她自己和其他人进行比较来做到这一点。

      请记住,如果数组未排序并且包含超过 1 个模态值(因此重复出现次数),这将返回第一个。最好先按 Arrays.sort(array) 对数组进行排序,这样您就可以选择最小或最大的模态值。

      public static int modeOfArray(int[] array){
          int mode;     
          int maxOccurance = 0;
      
          for(int i=0; i<array.length; i++){
              int occuranceOfThisValue = 0;
              for(int j=0; j<array.length; j++){
                  if(array[i] == array[j])
                     occuranceOfThisValue++;
              }
      
              if(occuranceOfThisValue > maxOccurance){
                  maxOccurance = occuranceOfThisValue;
                  mode = array[i];
              }
          }
          return mode;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-18
        • 1970-01-01
        • 1970-01-01
        • 2018-09-21
        • 2021-06-17
        • 1970-01-01
        • 2015-06-20
        相关资源
        最近更新 更多