What is the advantage of linked list over an array and vice versa?

前端 未结 6 2016
南旧
南旧 2021-01-30 18:12

Please explain what is the advantage of linked list over an array. And also is there any advantage of using array compared to linked list.

Regards, Shoaib

相关标签:
6条回答
  • 2021-01-30 18:35

    If you don't know the amount of objects you need to store beforehand, a list is probably what you want, since it's very easy to dynamically shrink or grow the list as needed. With this also comes the advantage of being able to easily insert elements mid-list without any need for reallocation.

    The disadvantage of a list vis-à-vis an array, on the other hand, is that it's slower to select individual elements, since you need to iterate. With an array, you won't have this problem. Arrays, on the other hand, are troublesome to use if you need to resize it, as this operation is more costly than adding or subtracting elements from a linked list.

    Lists should be used more commonly, since the ease of use is often more beneficial than the small performance gain from using a static size array.

    0 讨论(0)
  • 2021-01-30 18:35

    While it has been mentioned that arrays have better performance than linked lists, I am surprised to see no mention of the word "cache" anywhere. The problem with linked lists is mainly that they pretty much guarantee that every jump from node to node will be a cache miss, which is incredibly, brutally expensive, performance-wise.

    To put it crudely, if performance matters even the slightest bit in your program, you should never use a linked list. Ever. There is no excuse for it. They are far beyond "slow", they are catastrophically slow, and nothing about them can make up for that fact. Using them is like an intentional sabotage to your performance, like inserting a "wait()" function into your code for absolutely no reason.

    0 讨论(0)
  • 2021-01-30 18:36

    Both store a sequence of elements, but using different techniques.

    An array stores elements in successive order in memory, i.e. it looks like follows:

    --------------------------------------------------------------------------------------
    |  item 1  |  item 2  |  item 3  |  ...  ...  |  item x  | //here comes other stuff
    --------------------------------------------------------------------------------------
    

    This means, elements are one after another consecutive in memory.

    A ((doubly) linked) list, on the other hand, stores the items the following way: It creates an own "list item" for each element; this "list item" holds the actual element and a pointer/reference/hint/etc to the next "list item". If it is doubly linked, it also contains a pointer/reference/hint/etc to the previous "list item":

                                      ------------
    ------------        ----------    |  item 4  |
    |  item 1  |        | item 2 |    |  next ---+----...
    |  next ---+------->| next   |    ------------
    ------------        ---+------      ^
                           |            |
                           |            |
                           v            |
                           ----------   |
                           | item 3 |   |
                           | next --+---+
                           ----------
    

    This means, the elements can be spread all over the memory and are not stored at specific memory locations.

    Now that we know this, we can compare some usual operations on sequences of elements:

    • Accessing an element at a specific index: Using an array, we simply compute the offset for this index and have the element at the index.

      This is very cheap. With a list on the other hand, we do not know a priori where the element at index is stored (since all elements can be anywhere in memory), so we have to walk the list item by item until we find the element at the index. This is an expensive operation.

    • Adding a new element at the end of the sequence: Using an array this can lead to the following problem: Arrays are usually of fixed size, so if we have the situation that our array is already completely filled (see //here comes other stuff), we probably cant put the new element there because there might already be something else. So, maybe we have to copy the whole array. However, if the array is not filled, we can simply put the element there.

      Using a list, we have to generate a new "list item", put the element into it and set the next pointer of the currently last element to this new list item. Usually, we store a reference to the currently last element so that we don't have to search through the whole list to find it. Thus, inserting a new element is no real problem with lists.

    • Adding a new element somewhere in the middle: Let's first consider arrays: here, we might get into the following situation: We have an array with elements 1 to 1000:

      1 | 2 | 3 | 4 | 5 | 6 | ... | 999 | 1000 | free | free

      Now, we want to insert 4.5 between 4 and 5: This means, we have to move all elements from 5 to 1000 one position right in order to make space for the 4.5:

       1 | 2 | 3 | 4 | free | 5 | 6 | ... | 999 | 1000 | free
      
                        ||
                        vv
      
       1 | 2 | 3 | 4 | 4.5  | 5 | 6 | ... | 999 | 1000 | free
      

      Moving all these elements, is a very expensive operation. So better don't do this too often.

      Now we consider, how a list can perform this task: Let's say we have currently the following list:

       1 -> 2 -> 3 -> 4 -> 5 -> ... -> 999 -> 1000
      

      Again, we want to insert 4.5 between 4 and 5. This can be done very easily: We generate a new list item and update the pointers/references:

       1 -> 2 -> 3 -> 4        5 -> ... -> 999 -> 1000
                      |        ^
                      +-> 4.5 -+
      

      We have simply created a new list element and generated sort of "bypass" to insert it - very cheap (as long as we have a pointer/reference to the list item the new element will be inserted after).

    So, let's sum up: Linked lists are really nice when it comes to inserting at random positions (as long as you have a pointer to the adequate list item). If your operation involves adding lots of elements dynamically and traversing all elements anyway, a list might be a good choice.

    An array is very good when it comes to index accesses. If your application needs to access elements at specific positions very often, you should rather use an array.

    Notable things:

    • Solving the fixed-size problem for arrays: As mentioned before, (raw) arrays are usually of fixed size. However, this problem is nowadays no real point anymore, since almost all programming languages provide mechanisms to generate arrays that grow (and possibly shrink) dynamically - just as needed. This growing and shrinking can be implemented such that we have amortized runtime of O(1) for inserting and removing elements (at the end of the array) and such that the programmer doesn't have to call grow and shrink explicitly.

    • Since lists provide such nice properties for insertions, they can be used as underlying data structures for search trees, etc. I.e. you construct a search tree, whose lowest level consists of the linked list.

    0 讨论(0)
  • 2021-01-30 18:36

    Since you tagged the question with "data structures" I will answer this in that context.

    An array is fixed in size when you declare/create it meaning you can't add more elements to it. Thus, if I have an array of, say, 5 elements, you can do whatever you want with it but you can't add more elements to it.

    A linked-list is basically a way to represent a list where you can have as many "items" as you'd like. It consists of a head (the first element), a tail (the last element), and elements ( called nodes ) in-between the list.

    There are many types of linked-lists that you will probably encounter in any data structures class.

    The key thing you will learn with linked-lists is proficiency when learning how to create fields in your classes to point to other objects, which is the case for linked-lists where you need to construct your list such that each node points to the next node.

    Obviously, this is a very generalized answer. It should give you an idea for your class.

    0 讨论(0)
  • 2021-01-30 18:37

    Advantages of Array over Linked List

    1. The array has a specific address for each element stored in it and thus we can access any memory directly.

    2. As we know the position of the middle element and other elements are easily accessible too, we can easily perform BINARY SEARCH in the array.

    Disadvantages of Array over Linked List

    1. Total number of elements need to be mentioned or the memory allocation needs to be done at the time of array creation

    2. The size of the array, once mentioned, cannot be increased in the program. If the number of elements entered exceed the size of the array ARRAY OVERFLOW EXCEPTION occurs.

    Advantages of Linked List over Array

    1. Size of the list doesn't need to be mentioned at the beginning of the program.

    2. As the linked list doesn't have a size limit, we can go on adding new nodes (elements) and increasing the size of the list to any extent.

    Disadvantages of Linked List over Array

    1. Nodes do not have their own address. Only the address of the first node is stored and in order to reach any node, we need to traverse the whole list from beginning to the desired node.

    2. As all Nodes don't have their particular address, BINARY SEARCH cannot be performed.

    0 讨论(0)
  • 2021-01-30 18:47

    Arrays have a fixed size but are faster to access: they are allocated in one place and the location of each element is known (you can jump to the right element).

    Lists are not limited in size but for the amount of available memory. They are slower to access since to find an element you have to traverse the list.

    This is a very short explanation: I would suggest you to get a book on data structures and read it. These are basic concepts that you will need to fully understand.

    0 讨论(0)
提交回复
热议问题