面试问题汇总一:数据结构

一、数组和链表区别

数组:顺序结构,占用一块连续内存,提前申请内存大小,容易导致利用率不高,优点是可以随机访问,所以查找效率较高,但插入/删除效率因此效率较低,因为需要从插入/删除的点开始往后移动数组元素;对于数组中节点是通过首地址加偏移得到

链表:链式结构,不需要占用连续内存,逻辑顺序通过指针链接顺序实现,利用率较高,与数组相反,链表由于其链式结构,增加/删除节点操作效率高,但查找往往需要遍历整个链表,时间复杂度O(n),链表中节点是通过节点间的指针查找到的

二、几种树的遍历方式

广度优先遍历和深度优先遍历,广度优先遍历(BFS)可以借助队列实现

深度优先遍历(DFS)分为先序、中序、后序,可通过递归实现

三、几种常用排序算法

四、hash表

根据key值,通过hash表对应的hash函数,得到对应映射的地址值,基于此建立的表称为hash表

hash函数常见使用取余,index = key%m,m小于hash表长,保证映射出的地址都在表内

处理冲突方法:

        线性探测再散列,平方探测再散列,链地址法

java中的hashmap

        主体是一个Entry数组,每个Entry包含一个key-value键值对

下面这段代码来源

    static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;//存储指向下一个Entry的引用,单链表结构
        int hash;//对key的hashcode值进行hash运算后得到的值,存储在Entry,避免重复计算

        /**
         * Creates new entry.
         */
        Entry(int h, K k, V v, Entry<K,V> n) {
            value = v;
            next = n;
            key = k;
            hash = h;
        } 

可以看到Entry继承自map,这个数据结构就使用了key和value的映射关系

根据代码可以看到,hashmap其实是一个数组和链表的结合,数组是主体,链表的主要作用是解决冲突,也就是上面提到的链地址法

hashmap的几个重要字段:size 实际存储的key-value键值对;threshhold hashmap的阈值,存储数量达到阈值则扩容;loadFactor 负载因子,默认0.75;modCount hashmap被改变的次数

发布了63 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/LieberVater/article/details/104899201
今日推荐