Correct way to add an element to the end of a list?

前端 未结 2 628
离开以前
离开以前 2021-01-22 13:12

I was reading on this Haskell page about adding an element to the end of a List.

Using the example, I tried it out for my self. Given the following Li

相关标签:
2条回答
  • 2021-01-22 13:14

    It's the correct way in that all ways of doing it must reduce to at least that much work. The problem is wanting to append to the end of a list at all. That's not an operation that's possible to do efficiently with immutable linked lists.

    The better approach is figuring out how to solve your specific problem without doing that. There are a lot of potential approaches. Picking the right one depends on the details of what you're doing. Maybe you can get away with just using laziness correctly. Maybe you are best off generating the list backwards and then reversing it once at the end. Maybe you're best off using a different data structure. It all depends on your specific use case.

    0 讨论(0)
  • 2021-01-22 13:28

    ++ [x] is the correct way to add an element to the end of a list, but what the comment is saying is that you shouldn't add elements to the end of a list.

    Due to the way lists are defined, adding an element at the end always requires making a copy of the list. That is,

    xs ++ ys
    

    needs to copy all of xs but can reuse ys unchanged.

    If xs is just one element (i.e. we're adding to the beginning of a list), that's no problem: Copying one element takes practically no time at all.

    But if xs is longer, we need to spend more time in ++.

    And if we're doing this repeatedly (i.e. we're building up a big list by continually adding elements to the end), then we need to spend a lot of time making redundant copies. (Building an n-element list in this way is an O(n2) operation.)

    If you need to do this, there is usually a better way to structure your algorithm. For example, you can build your list in reverse order (adding elements at the beginning) and only call reverse at the end.

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