数据结构的对比


数组和链表的优缺点,: 数组的内存空间是连续的,链表的内存结构是不连续的内存空间
    数组:
        优点:数组支持随机访问,根据下标随机访问的时间复杂度为O(1),
        缺点:
        1)插入、删除的时间复杂度是O(n)
        2)若申请内存空间很大,比如100M,但若内存空间没有100M的连续空间时,则会申请失败,尽管内存可用空间超过100M。
        3)大小固定,若存储空间不足,需进行扩容,一旦扩容就要进行数据复制,而这时非常费时的。
    链表:
        优点:链表适合插入、 删除,时间复杂度O(1)    
        缺点:
            1)随机访问的时间复杂端是O(n)
            2)内存空间消耗更大,因为需要额外的空间存储指针信息。
            3)对链表进行频繁的插入和删除操作,会导致频繁的内存申请和释放,容易造成内存碎片,如果是Java语言,还可能会造成频繁的GC(自动垃圾回收器)操作。

ArrayList的优势:
    将很多数组操作的细节封装起来。 比如前面提到的数组插入、 删除数据时需要搬移其他数据等。
    支持动态扩容。
    arraylist里可以同时存放不同类型的对象(自己加的)
ArrayList的劣势:
    1.Java ArrayList无法存储基本类型, 如int、 long, 需要封装为Integer、 Long类, ⽽Autoboxing、 Unboxing则有一定的性能消耗, 所以如果特别关注性能, 或者希望使用基本类型, 就可以选用数组。
    2.如果数据大小事先已知, 并且对数据的操作非常简单, 用不到ArrayList提供的大部分方法, 也可以直接使用数组。
    3.当要表示多维数组时, 用数组往往会更加直观。 如Object[][] array;而用容器的话则需要这样定义: ArrayList<ArrayList > array。

队列和栈的实现:都可以用数组和链表实现。
    栈:栈尽量使用ArrayDeque:Deque接口及其实现提供了LIFO堆栈操作的完整:Deque<Integer> stack=new ArrayDeque<Integer>();
    队列:java中虽然有Queue接口,单java并没有给出具体的队列实现类,而Java中让LinkedList类实现了Queue接口,所以使用队列的时候,一般采用LinkedList。因为LinkedList是双向链表,可以很方便的实现队列的所有功能。


散列表:
    优点:插入删除查找都是O(1), 是最常用的,
    缺点:不能顺序遍历以及扩容缩容的性能损耗。(散列表中的数据是无序存储的,如果要输出有序的数据,需要先进行排序。)    

跳表:
    优点:插入删除查找都是O(logn), 并且能顺序遍历。
    缺点:空间复杂度O(n)。适用于不那么在意内存空间的,其顺序遍历和区间查找非常方便。

红黑树(平衡二叉查找树):
    优点:插入删除查找都是O(logn), 中序遍历即是顺序遍历,稳定。
    缺点:难以实现,去查找不方便。其实跳表更佳,但红黑树已经用于很多地方了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章