笔试面试——数据结构篇

堆和栈的区别

内存:
栈区(stack)- 编译器自动分配和释放 ,速度快,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆区(heap)- 由程序员分配释放,若程序员不释放,程序结束时可能由OS回收(速度比较慢,而且容易产生内存碎片)注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
数据结构:
栈-先进后出
堆是一种经过排序的树形数据结构,通常指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意的。

栈是一个元素集合,支持两个基本操作:push用于将元素压入栈,pop用于删除栈顶元素。
后进先出的数据结构(Last In First Out, LIFO)
时间复杂度
索引:O(n)
查找:O(n)
插入:O(1)
删除:O(1)

堆是一种基于树的满足某些特性的数据结构:整个堆中的所有父子节点的键值都满足相同的排序条件。堆分为最大堆和最小堆。在最大堆中,父节点的键值永远大于等于所有子节点的键值,根节点的键值是最大的。最小堆中,父节点的键值永远小于等于所有子节点的键值,根节点的键值是最小的。
时间复杂度
索引:O(log(n))
查找:O(log(n))
插入:O(log(n))
删除:O(log(n))
删除最大值/最小值:O(1)

链表

由节点(Node)组成的线性数据集合,每个节点通过指针指向下一个节点,用于表示序列的数据结构。删除插入方便,随机访问不方便。
单链表:每个节点仅指向下一个节点,最后一个节点指向空(null)。
双链表:每个节点有两个指针p,n。p指向前一个节点,n指向下一个节点;最后一个节点指向空。
循环链表:每个节点指向下一个节点,最后一个节点指向第一个节点。
时间复杂度:
索引:O(n)
查找:O(n)
插入:O(1)
删除:O(1)

//单链表反转,循环  
static Node reverseList(Node head){  
    if(head==null||head.next==null)return head;  
    Node pre=null;  
    Node nex=null;  
    while(head!=null){  
        nex=head.next;  
        head.next=pre;  
        pre=head;  
        head=nex;  
    }  
    return pre;  
}  
//单链表反转,递归  
static Node reverseListRec(Node head){  
    if(head==null||head.next==null)return head;  
    Node reHead=reverseListRec(head.next);  
    head.next.next=head;  
    head.next=null;  
    return reHead;  
} 

队列

队列是一个元素集合,支持两种基本操作:enqueue 用于添加一个元素到队列,dequeue 用于删除队列中的一个元素。
先进先出的数据结构(First In First Out, FIFO)。
时间复杂度
索引:O(n)
查找:O(n)
插入:O(1)
删除:O(1)

树是无向、联通的无环图。

二叉树

二叉树是一个树形数据结构,每个节点最多可以有两个子节点,称为左子节点和右子节点。
满二叉树(Full Tree):二叉树中的每个节点有 0 或者 2 个子节点。
完美二叉树(Perfect Binary):二叉树中的每个节点有两个子节点,并且所有的叶子节点的深度是一样的。
完全二叉树:二叉树中除最后一层外其他各层的节点数均达到最大值,最后一层的节点都连续集中在最左边。
二叉树遍历方法:前序遍历、中序遍历、后序遍历(针对根节点)

二叉查找树

二叉查找树(BST)是一种有序二叉树。其任何节点的值都大于等于左子树中的值,小于等于右子树中的值。
时间复杂度 索引:O(log(n)) 查找:O(log(n)) 插入:O(log(n)) 删除:O(log(n))

哈希

哈希用于将任意长度的数据映射到固定长度的数据。哈希函数的返回值被称为哈希值、哈希码或者哈希。如果不同的主键得到相同的哈希值,则发生了冲突。
Hash Map:hash map 是一个存储键值间关系的数据结构。HashMap 通过哈希函数将键转化为桶或者槽中的下标,从而便于指定值的查找。
冲突解决
链地址法(Separate Chaining):在链地址法中,每个桶(bucket)是相互独立的,每一个索引对应一个元素列表。处理HashMap 的时间就是查找桶的时间(常量)与遍历列表元素的时间之和。
开放地址法(Open Addressing):在开放地址方法中,当插入新值时,会判断该值对应的哈希桶是否存在,如果存在则根据某种算法依次选择下一个可能的位置,直到找到一个未被占用的地址。开放地址即某个元素的位置并不永远由其哈希值决定。

图是顶点和弧的集合的有序对。
分为有向图和无向图
深度优先遍历:一种先遍历子节点而不回溯的图遍历算法。
时间复杂度:O(|V| + |E|)
广度优先遍历:一种先遍历邻居节点而不是子节点的图遍历算法。
时间复杂度:O(|V| + |E|)

猜你喜欢

转载自blog.csdn.net/crayon_chen/article/details/80151203