1

即使我是一名艺术家,我也发现需要从一组数字中返回统计模式。我希望该函数避免使用关联数组(因为我需要在 JavaScript 和 Maxscript 中运行的版本,并且最好使用相同的代码库) Maxscript 不使用关联数组;这是一个遗憾,因为是一个相当好的解决方案。

下面的代码在第一个示例中有效,但在第二个示例中无效。猜测我会说数组需要事先排序,但这不起作用(我已经从代码中省略了它)有人能指出我哪里出错了吗?谢谢你。

var textArr = new Array();

arrOne = [0,1,0,2,3,10,10]
arrTwo = [1,2,3,1,1,1]

mode_without_associative_arrays(arrOne) // works fine
mode_without_associative_arrays(arrTwo) // doesn't work

function mode_without_associative_arrays(arr)
{
    if(arr.length == 0)
    return null;

    var collectArr = []; // array
    var countArr = []  // array to hold the count of each element in collectArr
    collectArr[0] = arr[0]
    countArr[0] = 1
    var mode = arr[0]
    maxCount = 1;

    for(var i = 0; i < arr.length; i++)
    {
        var ele = arr[i];

        for(var j = 0; j < collectArr.length; j++)
        {
            var addMe = false;
            if (collectArr[j] != ele) addMe = true
        }

            if (addMe == true)
            {
                collectArr.push(ele)
                countArr.push(1)
            }
            else
            {
                // count it up
                countArr[j]+=1
                if (countArr[j] > maxCount) 
                {
                    maxCount = countArr[j]
                    mode = ele
                }
            }
        }

        alert("Mode is " + mode + " which appears " + maxCount + " times!")
        return mode;
}
4

2 回答 2

1

如果没有关联数组,我认为最佳算法是:

  1. 对数组进行排序 - O(n log n)
  2. 线性扫描数组计数连续出现 - O(n)

对于第 2 步,将当前元素与前一个元素进行比较。如果相同,请增加您的计数器。如果计数器超过当前最大值,请记住当前元素的值(即当前模式)。如果元素不同,请将计数器重置为 1。

于 2013-09-11T13:17:54.213 回答
0

像这样的东西?

var arrayMode = function ( sequence ) {
    if ( sequence.length === 0)
        return 0;
    var collector = [];
    var instances = [];
    var max = 1;
    collector.push(sequence[0]);
    var mode = sequence[0];
    instances.push(1);

    for (var i = 1; i < sequence.length; i++ ) {
        var index = collector.indexOf( sequence[i] );
        if ( index === -1 ) {
            collector.push( sequence[i] );
            instances.push( 1 );
        } else {
            instances[ index ]++;
            if ( instances[ index ] > max ) {
                max = instances[ index ];
                mode = collector[ index ];
            }
        }
    }
    return mode;
}

在收集器中,我将按顺序保留元素的唯一实例,并且在实例中,我有每个不同实例按顺序出现的次数。

于 2016-05-13T23:33:04.770 回答