链表与未排序数据的链接列表与数组的可行性?

时间:2008-11-09 18:34:19

标签: java data-structures big-o

比较LinkedLists和Arrays,同时还比较它们与已排序和未排序数据的差异

  • 添加
  • 卸下
  • 正在检索
  • 排序
  • 整体速度
  • 总内存使用量

实际问题

  

讨论将未排序数据集实现为链表而不是数组的可行性。在插入,删除,检索,计算机内存和应用程序的速度方面会有什么权衡?

     

讨论将排序数据集实现为链表而不是数组的可行性。在插入,删除,检索,计算机内存和应用程序的速度方面会有什么权衡?

     

根据您对上述问题的回答,总结在应用程序中使用链接列表的成本和收益。

我的回答/输入:

  

LinkedLists必须在每次添加新节点时分配内存,在添加许多节点时非常有用,并且大小不断变化,但在添加少量元素时通常较慢

     

数组在程序运行的开始时分配内存,调整列表的速度很慢(如果必须调整大小,则添加很多元素)

     

由于索引

,数组中的检索速度更快      

由于指针

,在LinkedList中添加/删除速度更快

4 个答案:

答案 0 :(得分:2)

不确定这是什么类,但对于CS程序,你必须做得比“慢”和“快”做得更好。尝试根据所需的操作数量来量化。您应该熟悉通常用于此类量化的机器 - 使用该机器。

答案 1 :(得分:2)

未分类与排序。我会做一个,然后你真的需要做你的功课

Stackoverflow标记确实需要表来执行此操作。你想说的是对于未排序/数组,排序/数组,未排序/链接列表,排序/链接列表的操作是多么“昂贵”

最后一点:“应用程序的速度”是一个提示,不仅要考虑单个操作的速度。

* Adding

未排序:除非需要调整大小,否则添加数组为O(1) - 只需将其添加到最后。您可能想要讨论一个最小化开销的调整大小策略(提示:不要只是将大小增加一个)

排序:数组添加是O(n) - 找到添加它的地方是O(log(n)),但是你需要向上移动一半元素(平均)来为新的​​元素添加romm

未排序:链接列表为O(1) - 将其添加到列表的开头或结尾。

已排序:链接列表为O(n) - 虽然您可以再次在O(1)中添加元素,但您需要平均扫描列表的一半以找到放置它的位置。

所以,剩下的就交给你了。发表一个答案,我们会批评它,但为了从你的(大概)昂贵的教育中获得最大收益,你真的需要做一些工作:)

* Removing
* Retrieving
* Sorting
* Overall speed
* Overall memory usage

答案 2 :(得分:1)

Here is a C++ code that illustrates that sorting the data miraculously makes the code faster than the unsorted version. Let’s try out a sample C++ program to understand the problem statement better.

// CPP程序演示处理 //排序和未排序数组的时间

#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;

const int N = 100001;

int main()
{
    int arr[N];

    // Assign random values to array
    for (int i=0; i<N; i++)
        arr[i] = rand()%N;

    // for loop for unsorted array
    int count = 0;
    double start = clock();
    for (int i=0; i<N; i++)
        if (arr[i] < N/2)
            count++;

    double end = clock();
    cout << "Time for unsorted array :: "
         << ((end - start)/CLOCKS_PER_SEC)
         << endl;
    sort(arr, arr+N);

    // for loop for sorted array
    count = 0;
    start = clock();

    for (int i=0; i<N; i++)
        if (arr[i] < N/2)
            count++;

    end = clock();
    cout << "Time for sorted array :: "
         << ((end - start)/CLOCKS_PER_SEC)
         << endl;

    return 0;
}

//输出代码

Output :

Execution 1:
Time for an unsorted array: 0.00108
Time for a sorted array: 0.00053

Execution 2:
Time for an unsorted array: 0.001101
Time for a sorted array: 0.000593

Execution 3:
Time for an unsorted array: 0.0011
Time for a sorted array: 0.000418
Observe that time taken for processing a sorted array is less as compared to an unsorted array. The reason for this optimization for a sorted array is branch prediction.

答案 3 :(得分:0)

@Paul:谢谢

  
      
  • 卸下
  •   

未分类&amp;已排序:数组删除为O(n) - 必须移动所有元素以填充“空洞”

未分类&amp;已排序:链接列表为O(1) - 根据需要更改指针