数据结构面试总结(持续更新......)

1.说说红黑树?(路径,红节点的左右子树一定为黑,根节点一定为黑,叶节点(nul)节点必须为黑,

节点不是红就是黑,AVL树的对比,降低了高度的严格性对时间进行了优化,而AVL树的严格高度平衡耗费了更多的时间,这种时间主要在插入和删除过程中,但是如果查询操作特别多而动态调整很少那么AVL是更好的选择,否则红黑树更好)

2.哈希冲突?怎样解决?(开地址法,链地址法,再哈希法,公共溢出区)

3.(平衡多路查找树)b树,b+树,b*树?(引出,当数据非常多平衡二叉查找树会比较深,就会出现很多io操作

非常耗时性能达到瓶颈,所以出现了平衡多路查找树,b树数据信息分布在整棵树上,b+树是数据信息分布在

叶子节点上,而且叶子节点连成一个链表(例如跳表),适合范围性数据查找,b*树利用了b+树的空指针

建立了兄弟节点,用于分裂节点的时候(类似于线索二叉树))

4.位图法,布隆过滤器进行排序和去重和前top?(都可以进行去重,位图使用1个或者布隆过滤器使用了多个哈希函数,进行排序位图可以实现(申请n/32+1个大小的bytes数组,每32个位置代表int数组的1个位置,0-31,32-63....,数字如果出现位置就置1),前top问题:小顶堆,分治patiction,更精妙的是冒泡排序(每次可确定一个当前的最大值)!)

5.中缀表达式转为后缀表达式,前缀表达式?(转化为后缀表达式从前向后,转化为前缀表达式从后向前(转化为了后缀表达式求解),遇见数字直接加入字符串,遇见左括号直接入栈,右括号弹栈直到左括号出现,遇见符号如果栈尾的符号优先级小那么直接入栈,否则符号出栈直到栈尾元素优先级小于此符号,特殊的左括号优先级最小!

6.堆的插入和删除?(插入放入堆尾进行从底向上进行调整,删除的那个元素与堆底元素,然后对交换上去的元素向下进行调整进行堆化

7.堆和栈的区别?空间分配,栈是自动分配,堆是需要手动申请,数据类型先进后出的线性结构,树形结构,

8.对一千万个整数排序,整数范围[-1000,1000]间,用什么排序最快?(先映射到正整数上,计算每个位置上的个数构建一个计数信息表,在通过计数信息表构建一个位置表(比如:数值1000有10个前1000的数有200个,那么数值1000的位置信息表对应的值就是205个),从后向前便利数字在对应的位置表上个数减一(从前向后处理不方便))

9.第k大的数?(快排可以转化为前k大的问题,构建最小堆k个元素最后堆顶元素就是,冒泡)

10.前topk确立?(快排的paction函数,构建最小堆,冒泡很叼每一次都确立当前元素最大的一个)

11.最小生成树的prim和kruskal?prim每次连接顶点与树之间的最小距离(选最短的顶点,需要优先级队列),kruskal每次给顶点加最小权重的边只要不构成环(选最短的边,使用并查集主要利用递归实现路径压缩以及头目合并)

12.亿级文件进行取交集?(布隆过滤器进行判重来达到查找交集的效果但是会有小小的损失因为判定为重复可能不是重复因为出现了冲突但是判定为不是重复就一定不重复要是真要实现完全精准查在进行暴力检查也可以)

13.如何快速找出两个队列中相同的元素,假设队列的长度非常大?(1.直接hash,对一个队列元素经过hash进行存储,用另外一个队列计算hash值然后对比!(空间消耗大)2.布隆过滤器,创建位图只有0/1,生成多个hash函数每个函数计算一个值进行映射到k个位置记为1,然后一直这样处理即可如果映射到的值已经全是1了那就是重复的,但是会有误判的,不是重复的那么一定不是重复的是重复的可能实际上不重复(hash碰撞嘛)!(堆空间进行优化))

14.Dijkstra和最小生成树prim?(prim是每次选取一个节点到树的距离最短生成树,是针对整个图来说构建一个消费最少的结构)!dijkstra是单源点最短路径是每次选取一个距离源点最短的节点以此为节点进行更新每次都会以此节点为基础确定一个距离源点的未确定最短路径节点的最短路径!(适应于有向图权重为正的结构)(Dijkstra无法发现有环但是拓扑排序或者并查集+dfs可以进行发现))

猜你喜欢

转载自blog.csdn.net/taka_is_beauty/article/details/89118570
今日推荐