Java数组算法 - 大O.

时间:2013-10-31 13:32:42

标签: java algorithm big-o

关于Big O符号,解决以下问题的最佳方法是什么?

给定大小为N的String数组。遍历数组并返回包含在数组中重复的字符串的单个字符串。返回的字符串也应该重复字符串它在数组中的次数。 EX。如果在数组" Bob"是找到最多的字符串,它被发现3次返回的字符串应该是" BobBobBob"

在考虑如何执行此操作时,我考虑使用HashMap或强制使用唯一键值的其他内容,将字符串存储为键,将频率存储为值。当它完全说完了,这将让我在地图上迭代比较值..

总的来说,这会给我O(n)+ O(n)......我只是想知道是否有更好的方法来做到这一点

编辑:

我知道你不能比O(n)做得更好但这里的问题是,一旦我遍历初始数组来构建HashMap,我将不得不重新迭代hashmap以找出哪一对具有最高值这将再次是O(n)..基本上是有一种方法来做到这一点,我只需要迭代整个列表一次

3 个答案:

答案 0 :(得分:3)

我的2美分:O(2n)不错,但也许你可以做得更好......

您可以使用HashMap<String, Integer>,然后使用即时更新的WinnerText字符串和WinnerCount整数计数器。然后在最后使用后两个来构建结果字符串,这应该给你O(n)+ O(1)。

答案 1 :(得分:1)

确定你必须抛出所有数组,所以我认为你只需要创建一个结构或类,如:

     class myString{
       public String str ;
       public int repetition ;
       public myString(String str){
             this.str = str ;
             repetition = 1 ;
       }
       public void increment(){
              repetition+=1;
       }
      }

你使用它并抛出你的数组并创建新对象并在找到现有对象时增加。最后,你正在搜索的重复值很高的那个

答案 2 :(得分:1)

只要您必须遍历整个列表以回退您的值,您就永远不会比O(n)更好。我能想到任何接近O(1)的东西的唯一方法是存储一个“max”实例变量,用于计算插入过程中的最大值。

但实际上你只是为O(n)插入物交易O(1)插入物。但是,根据您将更频繁地使用哪个,这可能对您有用。

更好的替代方案(尽管开销非常大)将在您向数组中插入值时存储所有总计数的哈希映射。然后你可以保持一个运行总计,并且存储最大值将比O(n)更接近O(log n)更好。

编辑:

我理解您现在要问的内容...您可以尝试将您的值存储在二进制搜索树中......当您将数据添加到数据结构中时,它会对您的数据进行排序,并且对该数据结构的任何调用都将是O(log n)表示遍历的get和O(1)表示拉回根(或最大值)。