美文网首页
链表、递归、堆、Hashmap、归并排序算法

链表、递归、堆、Hashmap、归并排序算法

作者: ElfACCC | 来源:发表于2019-07-17 15:46 被阅读0次

    java数据结构——链表

    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。

    使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。

    java算法——递归

    java堆

    堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都为O(logN),这样尽管删除的时间变慢了,但是插入的时间快了很多,当速度非常重要,而且有很多插入操作时,可以选择用堆来实现优先级队列。
    数组表示堆的一些要点。若数组中节点的索引为x,则:
      节点的左子节点是 2index+1,
      节点的右子节点是 2
    index+2,
      节点的父节点是 (index-1)/2。

    hashmap、linkedhashmap

    Hashmap

    是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null(如果建是null存在数组的第一个位置);允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

    Hashtable

    与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。

    LinkedHashMap

    是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造 时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

    TreeMap

    实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

    一 般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列.

    归并算法

    主要算法:

     int count = 0;
        public int InversePairs(int [] array) {
            if(array==null)
                return 0;
            mergeSort(array,0,array.length-1);
            return count;
        }
    
        private void mergeSort(int[] data,int start,int end) {
            int mid = (start + end) / 2;
            if (start < end) {
                mergeSort(data, start, mid);
                mergeSort(data, mid + 1, end);
                merge(data, start, mid, end);
            }
        }
    
        public void merge(int[] data,int start,int mid,int end) {
            int arr[] = new int[end - start + 1];
            int c = 0;
            int s = start;
            int index = mid + 1;
            while (start <= mid && index <= end) {
                if (data[start] < data[index]) {
                    arr[c++] = data[start++];
                } else {
                    arr[c++] = data[index++];
                    count += mid +1 - start;
                    count %= 1000000007;
                }
            }
    
            while (start <= mid) {
                arr[c++] = data[start++];
            }
    
            while (index <= end) {
                arr[c++] = data[index++];
            }
    
            for (int d : arr) {
                data[s++] = d;
            }
        }
    

    相关文章

      网友评论

          本文标题:链表、递归、堆、Hashmap、归并排序算法

          本文链接:https://www.haomeiwen.com/subject/fcimkctx.html