b)Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。
c)关键字的个数n必须满足:
ceil(m/2)-1<=n<=m-1。
一棵m阶的B+tree和m阶的B-tree的差异在于:
1.有n棵子树的结点中含有n个关键字;(B-tree是n棵子树有n-1个关键字)
2.所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。
(B-tree的叶子节点并没有包括全部需要查找的信息)
3.所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。
(B-tree的非终节点也包含需要查找的有效信息)
参考:
9、位图
位图的原理就是用一个bit来标识一个数字是否存在,采用一个bit来存储一个数据,所以这样可以大大的节省空间。
bitmap是很常用的数据结构,比如用于BloomFilter中;用于无重复整数的排序等等。
bitmap通常基于数组来实现,数组中每个元素可以看成是一系列二进制数,所有元素组成更大的二进制集合。
算法面试题
1、数据里有{1,2,3,4,5,6,7,8,9},请随机打乱顺序,生成一个新的数组(请以代码实现)
2、写出代码判断一个整数是不是2的阶次方(请代码实现,谢绝调用API方法)
3、假设今日是2015年3月1日,星期日,请算出13个月零6天后是星期几,距离现在多少天(请用代码实现,谢绝调用API方法)
4、有两个篮子,分别为A和B,篮子A里装有鸡蛋,篮子B里装有苹果,请用面向对象的思想实现两个篮子里的物品交换(请用代码实现)
B.show();
}
}
classBasket{
publicStringname;//篮子名称privateGoodsgoods;//篮子中所装物品publicBasket(Stringname){
//TODOAuto-generatedconstructorstub
this.name=name;System.out.println(name+"篮子被创建");
}
//装物品函数
publicvoidload(Stringname){goods=newGoods(name);
System.out.println(this.name+"装载了"+name+"物品");
}
publicvoidchange(BasketB){
System.out.println(this.name+"和"+B.name+"中的物品发生了交换");Stringtmp=this.goods.getName();this.goods.setName(B.goods.getName());
B.goods.setName(tmp);
}
publicvoidshow(){
System.out.println(this.name+"中有"+goods.getName()+"物品");
}
}
classGoods{
privateStringname;//物品名称publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){this.name=name;
}
publicGoods(Stringname){
//TODOAuto-generatedconstructorstubthis.name=name;
}
}
5、二分查找
又叫折半查找,要求待查找的序列有序。
每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。
直到查找到了为止,否则序列中没有待查的关键字。
6、冒泡排序算法
1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。
(2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
(3)N=N-1,如果N不为0就重复前面二步,否则排序完成。
7、插入排序算法
通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。
插入排序非常类似于整扑克牌。
在开始摸牌时,左手是空的,牌面朝下放在桌上。
接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。
为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。
无论什么时候,左手中的牌都是排好序的。
如果输入数组已经是排好序的话,插入排序出现最佳情况,其运行时间是输入规模的一个线性函数。
如果输入数组是逆序排列的,将出现最坏情况。
平均情况与最坏情况一样,其时间代价是(n2)。
8、快速排序算法
快速排序的原理:
选择一个关键值作为基准值。
比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的)。
一般选择序列的第一个元素。
一次循环:
从后往前比较,用基准值和最后一个值比较,如果比基准值小的交换位置,如果没有继续比较下一个,直到找到第一个比基准值小的值才交换。
找到这个值之后,又从前往后开始比较,如果有比基准值大的,交换位置,如果没有继续比较下一个,直到找到第一个比基准值大的值才交换。
直到从前往后的比较索引>从后往前比较的索引,结束第一次循环,此时,对于基准值来说,左右两边就是有序的了。
9、希尔排序算法
基本思想:
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
1.操作方法:
选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;
2.按增量序列个数k,对序列进行k趟排序;
3.每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序。
仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。
10、归并排序算法
归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。
然后再把有序子序列合并为整体有序序列。
11、桶排序算法
桶排序的基本思想是:
把数组arr划分为n个大小相同子区间(桶),每个子区间各自排序,最后合并
。
计数排序是桶排序的一种特殊情况,可以把计数排序当成每个桶里只有一个元素的情况。
1.找出待排序数组中的最大值max、最小值min
2.我们使用动态数组ArrayList作为桶,桶里放的元素也用ArrayList存储。
桶的数量为
(maxmin)/arr.length+1
3.遍历数组arr,计算每个元素arr[i]放的桶
4.每个桶各自排序
12、基数排序算法
将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。
然后,从最低位开始,依次进行一次排序。
这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
13、剪枝算法
在搜索算法中优化中,剪枝,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。
应用剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应当保留的方法。
14、回溯算法
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。
15、最短路径算法
从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路径。
解决最短路的问题有以下算法,Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法等
16、最小生成树算法
现在假设有一个很实际的问题:
我们要在n个城市中建立一个通信网络,则连通这n个城市需要布置
n-1一条通信线路,这个时候我们需要考虑如何在成本最低的情况下建立这个通信网?
于是我们就可以引入连通图来解决我们遇到的问题,n个城市就是图上的n个顶点,然后,边表示两个城市的通信线路,每条边上的权重就是我们搭建这条线路所需要的成本,所以现在我们有n个顶点的连通网可以建立不同的生成树,每一颗生成树都可以作为一个通信网,当我们构造这个连通网所花的成本最小时,搭建该连通网的生成树,就称为最小生成树。
构造最小生成树有很多算法,但是他们都是利用了最小生成树的同一种性质:
MST性质(假设N=(V,
{E})是一个连通网,U是顶点集V的一个非空子集,如果(u,v)是一条具有最小权值的边,其中u属于U,v属于V-U,则必定存在一颗包含边(u,v)的最小生成树),下面就介绍两种使用MST性质生成最小生成树的算法:
普里姆算法和克鲁斯卡尔算法。
17、AES
高级加密标准(AES,AdvancedEncryptionStandard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。
对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:
18、RSA
RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法。
非对称加密是通过两个密钥(公钥-私钥)来实现对数据的加密和解密的。
公钥用于加密,私钥用于解密。
19、CRC
循环冗余校验(CyclicRedundancyCheck,CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。
它是利用除法及余数的原理来作错误侦测的。
20、MD5
MD5常常作为文件的签名出现,我们在下载文件的时候,常常会看到文件页面上附带一个扩展名
为.MD5的文本或者一行字符,这行字符就是就是把整个文件当作原数据通过MD5计算后的值,我们下载文件后,可以用检查文件MD5信息的软件对下载到的文件在进行一次计算。
两次结果对比就可以确保下载到文件的准确性。
另一种常见用途就是网站敏感信息加密,比如用户名密码,支付签名等等。
随着https技术的普及,现在的网站广泛采用前台明文传输到后台,MD5加密(使用偏移量)的方式保护敏感数据保护站点和数据安全。
21、更多算法练习
更多算法练习题,请访问https:
//leetcode-