【问题标题】:is there any faster way to generate List of N integer有没有更快的方法来生成 N 整数列表
【发布时间】:2013-06-10 19:14:18
【问题描述】:

好吧,我知道这是一个非常新手的问题,但我什么都没有想到。目前我正在尝试这个,但对于这么大的数字来说,这是效率最低的方法。任何人都可以帮助我。

int count = 66000000;
LinkedList<Integer> list = new LinkedList<Integer>();
        for (int i=1;i<=count;i++){
            list.add(i);
            //System.out.println(i);
        }

编辑:

实际上我已经对整个列表(队列)重复执行操作(比如在某个条件下删除一些元素并再次添加),因此必须迭代整个列表变得如此缓慢,因为这样的数字需要超过 10 分钟。

【问题讨论】:

  • 你可以用 C 写它。:-)
  • 根据用例,您还可以使用IntRange 或基于SetList 实现类似的东西。
  • @jCoder 用例是:约瑟夫斯问题。所以我需要一个队列。
  • ArrayList 或 TIntArrayList 或 int[] 会更快,但通常最快的方法是不做。我怀疑如果有更多上下文,您可能会首先了解如何消除对列表的需求。

标签: java


【解决方案1】:

您的输出大小为 O(n),因此实际上不可能有一种算法比 O(n) 时间复杂度更有效地填充您的列表。

您将数字打印到屏幕上所花费的时间比实际生成列表所花费的时间要多得多。如果您真的想加快此代码的速度,请删除

System.out.println(i);

另外,我注意到您使用的是LinkedList,如果您使用数组(或基于数组的列表),它应该会更快。

【讨论】:

  • 哦,很明显我想不通:(
  • O() 表示法仅衡量复杂性,而不是实际性能。未指定的常数很重要,而且通常比固有的复杂性更重要。可能使用数组而不是列表会大大缩短时间。一些循环展开也可能有帮助。
  • 是的,实际上我的整个操作因为数量太大而变得很耗时,我以为它卡住了,所以只是想弄清楚我添加了打印。
  • 另一方面,如果所有 OP 需要的是一个 List,而不是一个 LinkedList,则可以在 O(1) 中创建表示。
  • 很确定 LinkedList#add(obj) 的复杂度为 O(1),因为它实际上是在实现一个双向链表。
【解决方案2】:

您可以实现List,其中get(int index) 方法只返回索引(或基于索引的某个值)。然后列表的创建将是常数时间(O(1))。该列表必须是不可变的。

【讨论】:

  • 相当有趣的解决方案
  • 您实际上可以更进一步,实现一个set(int index),它维护一个字典,其中仅包含与默认值发生变化的元素。
【解决方案3】:

您的问题不仅仅是建立列表,还包括删除和重新插入。我怀疑您应该使用 HashSet,甚至可能是 BitSet 而不是任何类型的 List。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 2012-12-22
    相关资源
    最近更新 更多