【面试题】数据结构和算法

一、谈一谈,id全局唯一且自增,如何实现?

SnowFlake算法,是Twitter开源的分布式id生成算法。
核心思想:使用一个64bit的long型的数字作为全局唯一id。【在分布式系统中的应用十分广泛】
在这里插入图片描述

SnowFlake id生成规则
第一位标识符:0,正数是0,负数是1;
第2-42位标识符(41位标识符):时间戳:当前时间-开始时间 的值;
第43-52位标识符(10位机器标识码):5位机房ID+5位机器ID;
第53-64位标识符:毫秒内的计数,每毫秒内生成的id的序号;

SnowFlake优点:

  • 高性能高可用:生成时不依赖于数据库,完全内存中生成;
  • 容量大:每秒中能生成数百万的自增ID;
  • ID自增:存入数据库,索引效率高;
  • 所有生成的id按时间趋势递增;整个分布式系统内不会产生重复id;

SnowFlake缺点:

  • 依赖与系统时间的一致性,如果系统时间被回调或者改变,就会造成id冲突或者重复;
二、B树和B+树

大学数据结构解释图

B树
在这里插入图片描述
B+树

在这里插入图片描述

  • B+树的叶子结点保存了父节点的所有关键字记录的指针,所有数据地址必须要到叶子节点才能获取到。所以每次数据查询的次数都一样;
  • B+树叶子结点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针;
  • B+树的层级更少,相较于B树B+每个非叶子节点存储的关键字数更多,输的层级更少所以查询数据更快;
  • B+树所有的叶子结点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密型很高,缓存的命中率也会比B树高;
  • B+树遍历整棵树只需要遍历所有的叶子结点即可,而不是像B树一样需要对每一层进行遍历,有利于全表扫描;
三、什么是算法

定义:为了通过输入求得需要的输出而制定的明确的步骤
特征:

  • 输入:算法有0或多个输入
  • 输出:至少有一个或者多个输出;
  • 确切性:每一个步骤都有明确的意义;相同的输入只能有唯一的输出结果;
  • 可行性:每一步都通过执行有限的次数完成;
  • 有穷性:执行有限的步骤之后自动结束而不会出现无限循环;
四、数组和链表的区别

数组:开辟的内存空间是连续的,且内存大小一经确定之后无法再修改;逻辑上和物理上都是连续的;
链表:存储数据的内存是不连续的,链表中的数据可以存储在内存的任何地方,链表中的每个数据都存储了下一个链表的地址;每个链表包含了多个节点,每个节点又包含了数据域和引用域;

数组查找速度快,增加和删除的效率低
查询快是因为可以直接通过数组的索引得到对应的数据;或者直接遍历从头到尾顺序查找一遍也能快速得到数据;
增添和删除效率低是因为数组的大小开始确定之后,就无法更改;内存空间要求高,必须有足够的连续内存空间,可能造成内存浪费

链表查找效率慢:因为它可任意在内存空间中存储数据;内存利用率高,不浪费内存;大小不固定,拓展很灵活;
添加和删除元素方便:只需要修改前一个元素的指针域即可;

五、如何知道二叉树的深度

1、如果当前二叉树节点为空,则直接返回0;
2、通过递归调用,分别获取当前节点左右子树的最小深度;
3、如果当前节点的左子树为空,则其最小深度就是右子树最小深度加1;
4、如果当前节点的右子树为空,则其最小深度就是左子树最小深度加1;
5、如果左右子树都不为空,则其最小深度为左右子树最小深度加1;

六、堆排序的原理是什么?


定义:完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大堆;每个节点的值都小于或等于左右节点的值,称为小堆;
基本思路
将无序序列构成一个堆,根据升序降序需求来选择大堆或者小堆
将堆顶元素与末尾元素互换
继续调整解结构使其满足堆定义,继续交换堆顶元素与末尾元素,反复调整+交换步骤,直到整个序列有序;
时间复杂度:O(nlog2n)
空间复杂度:O(1)

思想
1、建堆:升序:建大堆;降序:建小堆;
2、利用堆删除思想来进行排序;

七、二分查找

必须采用顺序存储结构;
表中元素必须按关键字有序排列;

查找过程:假设表中是有序排列,将表中间的关键字与查找关键字做比较如果相等则成功;否则利用中间位置记录将表分成前后两个表,如果中间位置的关键字大于查找关键字,则向前查找,否则向后查找;重复此过程,直到找到满足条件的关键字结束过程

时间复杂度:O(log2n);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值