簡體   English   中英

如何找到小於O(n)的數組中出現次數最多的數字?

[英]How to find a number that occurs the most in an array in less than O(n)?

我一直在研究一些編碼Katas,以改進我的編程。 我的問題是如何用小於 O(n)的方法解決此問題。 我的第一個想法是使用正則表達式,但是遇到了以下概述的一些問題。

問題定義

使用JavaScript語言,使函數SimpleMode(arr)接受存儲在arr中的數字數組,並返回最常出現的數字(模式)。 例如:如果arr包含[10、4、5、2、4],則輸出應為4。如果有多個模式,則返回第一個出現在數組中的模式(即[5、10、10、6] ,,5]應該返回5,因為它首先出現。 如果沒有模式,則返回-1。 數組不會為空。

O(n)解

這是我能夠想到的O(n)解決方案:

 function simpleMode(set) { var counter = {}; var most = set.reduce(function(most, value) { if (!counter[value]) { counter[value] = 0; } counter[value]++; if (!counter[most] || counter[value] > counter[most]) { most = value; } return most; }, -1); return (counter[most] === 1 ? -1 : most); }; console.log(simpleMode([5, 2, 5, 2, 3, 1])); 
 <script src="https://getfirebug.com/firebug-lite-debug.js"></script> 

到目前為止的正則表達式解決方案:

該解決方案的問題在於,它不符合返回最先出現的值的要求。 同樣,我覺得使用sort有點作弊,但它仍應小於O(n)。

 function simpleMode(set) { var values = set.sort().join('') var regex = new RegExp(/(\\d)\\1+/g); var matches = regex.exec(values); return (matches ? matches[1] : -1); } console.log(simpleMode([5, 2, 5, 2, 3, 1])); 
 <script src="https://getfirebug.com/firebug-lite-debug.js"></script> 

摘要

  • 小於O(n)怎么解決?
  • 正則表達式解決方案如何固定工作?

這樣的算法是不可能的。 假設任何算法查看的數組少於n / 2個元素。 然后,如果未查看的元素相同,則它們將是最常見的值。

因此, 任何找到最常見元素的算法都必須始終查看數組的n / 2個元素,因此其時間復雜度必須至少為O(n)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM