2010-09-24 71 views
20
var store = ['1','2','2','3','4']; 

Tôi muốn tìm hiểu rằng 2 xuất hiện nhiều nhất trong mảng. Làm thế nào để tôi làm được điều đó?Lấy mục xuất hiện nhiều lần nhất trong một mảng

+3

là mảng luôn được sắp xếp (vì nó là trong ví dụ của bạn)? – Thilo

+1

Xem tại đây để biết câu trả lời giả của tôi: http://stackoverflow.com/questions/3774757/c-get-mode-from-list-of-integers/3774791#3774791 – paxdiablo

+1

Nếu câu trả lời cho câu hỏi của @ Thilo là có, các yếu tố giống nhau sẽ luôn được nhóm lại với nhau. Điều này cho phép bạn lặp qua danh sách khi so sánh từng mục với danh sách trước và giữ số lượng các phần tử bạn đã gặp phải và chạy cao nhất gặp phải trên đường đi. Vào cuối vòng lặp, bạn sẽ có câu trả lời. Điều này sẽ chạy trong thời gian tuyến tính. Nếu câu trả lời cho câu hỏi của @ Thilo là không, sau đó sắp xếp danh sách đầu tiên, theo sau là chiến lược ở trên. – Asaph

Trả lời

27

tôi sẽ làm một cái gì đó như:

var store = ['1','2','2','3','4']; 
var frequency = {}; // array of frequency. 
var max = 0; // holds the max frequency. 
var result; // holds the max frequency element. 
for(var v in store) { 
     frequency[store[v]]=(frequency[store[v]] || 0)+1; // increment frequency. 
     if(frequency[store[v]] > max) { // is this frequency > max so far ? 
       max = frequency[store[v]]; // update max. 
       result = store[v];   // update result. 
     } 
} 
+1

+1 - Rất đẹp ... Nhưng tôi sẽ sử dụng vòng lặp 'for' để chặn các trường hợp góc trong đó đối tượng mảng có các thuộc tính: http://jsfiddle.net/9eJd3/ –

+0

Tôi muốn đề xuất thêm' if (store.hasOwnProperty (v)) 'trong trường hợp ai đó đã quyết định sửa đổi nguyên mẫu của Object hoặc Array, như những người có vẻ hơi quan tâm đến việc đó xung quanh đây, P –

+0

@no - Điều đó không đủ tốt, vì' store' có thể có thuộc tính riêng của ** không phải là ** giá trị của mảng. (http://jsfiddle.net/vR5JK/). Một vòng lặp 'for' sẽ thực hiện thủ thuật, vì bất cứ điều gì bên ngoài các giá trị trong mảng không được bao gồm trong' store [0] 'để' lưu trữ [store.length] ' –

2

Tạo biểu đồ, tìm khóa cho số tối đa trong biểu đồ.

var hist = []; 
for (var i = 0; i < store.length; i++) { 
    var n = store[i]; 
    if (hist[n] === undefined) hist[n] = 0; 
    else hist[n]++; 
} 

var best_count = hist[store[0]]; 
var best = store[0]; 
for (var i = 0; i < store.length; i++) { 
    if (hist[store[i]] > best_count) { 
    best_count = hist[store[i]]; 
    best = store[i]; 
    } 
} 

alert(best + ' occurs the most at ' + best_count + ' occurrences'); 

Giả định này không có quan hệ hoặc bạn không quan tâm được chọn.

+1

Không cần thiết nếu mảng được sắp xếp, mặc dù. Sau đó, nó có thể là một hoạt động một lần. – Thilo

+1

Là một lưu ý phụ, đây được gọi là chế độ phân phối. –

1

Nếu mảng được sắp xếp này nên làm việc:

function popular(array) { 
    if (array.length == 0) return [null, 0]; 
    var n = max = 1, maxNum = array[0], pv, cv; 

    for(var i = 0; i < array.length; i++, pv = array[i-1], cv = array[i]) { 
     if (pv == cv) { 
     if (++n >= max) { 
      max = n; maxNum = cv; 
     } 
     } else n = 1; 
    } 

    return [maxNum, max]; 
}; 

popular([1,2,2,3,4,9,9,9,9,1,1]) 
[9, 4] 

popular([1,2,2,3,4,9,9,9,9,1,1,10,10,10,10,10]) 
[10, 5] 
+0

Các giá trị không cần phải được đặt hàng, chỉ cần nhóm lại. Ít so sánh phát sinh hơn nếu tần số _mode của ứng cử viên hiện tại được kiểm tra 'if (pv! = Cv)'. – greybeard

+0

@greybeard, arr.sort() có 'nhóm' tốt không? Tôi biết nó không phân loại tốt cho các loại khác nhau, nhưng nó có phân nhóm chính xác không? – user2734550

0

Phiên bản này sẽ từ bỏ tìm kiếm khi đếm vượt quá số hạng mục chưa tính.

Nó hoạt động mà không cần sắp xếp mảng.

Array.prototype.most= function(){ 
    var L= this.length, freq= [], unique= [], 
    tem, max= 1, index, count; 
    while(L>= max){ 
     tem= this[--L]; 
     if(unique.indexOf(tem)== -1){ 
      unique.push(tem); 
      index= -1, count= 0; 
      while((index= this.indexOf(tem, index+1))!= -1){ 
       ++count; 
      } 
      if(count> max){ 
       freq= [tem]; 
       max= count; 
      } 
      else if(count== max) freq.push(tem); 
     } 
    } 
    return [freq, max]; 
} 

    //test 
    var A= ["apples","oranges","oranges","oranges","bananas", 
    "bananas","oranges","bananas"]; 
    alert(A.most()) // [oranges,4] 

    A.push("bananas"); 
    alert(A.most()) // [bananas,oranges,4] 
-1

Nếu mảng chứa các chuỗi thử giải pháp này

function GetMaxFrequency (array) { 
    var store = array; 
    var frequency = []; // array of frequency. 
    var result; // holds the max frequency element. 

    for(var v in store) { 
     var target = store[v]; 
     var numOccurences = $.grep(store, function (elem) { 
     return elem === target; 
     }).length; 
     frequency.push(numOccurences); 

    } 
    maxValue = Math.max.apply(this, frequency); 
    result = store[$.inArray(maxValue,frequency)]; 
    return result; 
} 
var store = ['ff','cc','cc','ff','ff','ff','ff','ff','ff','yahya','yahya','cc','yahya']; 
alert(GetMaxFrequency(store)); 
0

tôi giải quyết nó theo cách này cho việc tìm kiếm các số nguyên phổ biến nhất

function mostCommon(arr) { 
    // finds the first most common integer, doesn't account for 2 equally common integers (a tie) 

    freq = []; 

    // set all frequency counts to 0 
    for(i = 0; i < arr[arr.length-1]; i++) { 
     freq[i] = 0; 
    } 

    // use index in freq to represent the number, and the value at the index represent the frequency count 
    for(i = 0; i < arr.length; i++) { 
     freq[arr[i]]++; 
    } 

    // find biggest number's index, that's the most frequent integer 
    mostCommon = freq[0]; 
    for(i = 0; i < freq.length; i++) { 
     if(freq[i] > mostCommon) { 
     mostCommon = i; 
     } 
    } 

    return mostCommon; 
} 
3
arr.sort(); 
    var max=0,result,freq = 0; 
    for(var i=0; i < arr.length; i++){ 
     if(arr[i]===arr[i+1]){ 
      freq++; 
     } 
     else { 
      freq=0; 
     } 
     if(freq>max){ 
      result = arr[i]; 
      max = freq; 
     } 
    } 
    return result; 
+0

Vì có nhiều câu trả lời khác, nên thêm giải thích là tại sao giải pháp của bạn lại thích hợp hơn. Bạn có thể thêm giải thích bằng cách nhấp vào nút "chỉnh sửa" ... –

+1

Có arr.sort() luôn luôn sắp xếp nhóm các loại khác nhau trong mảng chính xác không? – user2734550

+1

có @ user2734550. arr.sort() có thể sắp xếp nhóm các kiểu khác nhau trong mảng một cách chính xác. nhưng nếu bạn đang đối phó với duy nhất cùng với số chữ số muliple, bạn có thể cần phải sắp xếp theo cách này: arr.sắp xếp (chức năng (a, b) {return a- b;}) – Ashikodi

4

Giải pháp với sự nhấn mạnh đến Array.prototype.forEach và vấn đề nhận được nhiều hơn một khóa nếu số lượng tối đa được chia sẻ giữa các mục khác.

Chỉnh sửa: Chỉ đề xuất với một vòng lặp.

var store = ['1', '2', '2', '3', '4', '5', '5'], 
 
    distribution = {}, 
 
    max = 0, 
 
    result = []; 
 

 
store.forEach(function (a) { 
 
    distribution[a] = (distribution[a] || 0) + 1; 
 
    if (distribution[a] > max) { 
 
     max = distribution[a]; 
 
     result = [a]; 
 
     return; 
 
    } 
 
    if (distribution[a] === max) { 
 
     result.push(a); 
 
    } 
 
}); 
 
console.log('max: ' + max); 
 
console.log('key/s with max count: ' + JSON.stringify(result)); 
 
console.log(distribution);

-1

Một giải pháp khá ngắn.

function mostCommon(list) { 
 
    var keyCounts = {}; 
 
    var topCount = 0; 
 
    var topKey = {}; 
 
    list.forEach(function(item, val) { 
 
    keyCounts[item] = keyCounts[item] + 1 || 1; 
 
    if (keyCounts[item] > topCount) { 
 
     topKey = item; 
 
     topCount = keyCounts[item]; 
 
    } 
 
    }); 
 

 
    return topKey; 
 
} 
 

 
document.write(mostCommon(['AA', 'AA', 'AB', 'AC']))

0

Đây là giải pháp của tôi.

var max_frequent_elements = function(arr){ 
var a = [], b = [], prev; 
arr.sort(); 
for (var i = 0; i < arr.length; i++) { 
    if (arr[i] !== prev) { 
     a.push(arr[i]); 
     b.push(1); 
    } else { 
     b[b.length-1]++; 
    } 
    prev = arr[i]; 
} 


var max = b[0] 
for(var p=1;p<b.length;p++){ 
     if(b[p]>max)max=b[p] 
} 

var indices = [] 
for(var q=0;q<a.length;q++){ 
    if(b[q]==max){indices.push(a[q])} 
} 
return indices; 

};

-1

Giải pháp này trả về một mảng các số xuất hiện nhiều nhất trong một mảng, trong trường hợp nhiều số xuất hiện ở thời gian "tối đa".

function mode(numbers) { 
     var counterObj = {}; 
     var max = 0; 
     var result = []; 
     for(let num in numbers) { 
     counterObj[numbers[num]] = (counterObj[numbers[num]] || 0) + 1; 
     if(counterObj[numbers[num]] >= max) { 
      max = counterObj[numbers[num]]; 
     } 
     } 
     for (let num in counterObj) { 
     if(counterObj[num] == max) { 
      result.push(parseInt(num)); 
     } 
     } 
     return result; 
    } 
-1

Tất cả các giải pháp trên đều lặp lại.

Dưới đây là một ES6 chức năng đột biến ít phiên bản:

Array.prototype.mostRepresented = function() { 
    const indexedElements = this.reduce((result, element) => { 
    return result.map(el => { 
     return { 
     value: el.value, 
     count: el.count + (el.value === element ? 1 : 0), 
     }; 
    }).concat(result.some(el => el.value === element) ? [] : {value: element, count: 1}); 
    }, []); 
    return (indexedElements.slice(1).reduce(
    (result, indexedElement) => (indexedElement.count > result.count ? indexedElement : result), 
    indexedElements[0]) || {}).value; 
}; 

Nó có thể được tối ưu hóa trong các tình huống cụ thể mà thực hiện là nút cổ chai, nhưng nó có một lợi thế lớn khi làm việc với bất kỳ loại phần tử mảng.

Dòng cuối cùng có thể được thay thế bằng:

return (indexedElements.maxBy(el => el.count) || {}).value; 

Với:

Array.prototype.maxBy = function(fn) { 
    return this.slice(1).reduce((result, element) => (fn(element) > fn(result) ? element : result), this[0]); 
}; 

cho rõ ràng

Các vấn đề liên quan