考数据库系统会用到的一些计算方法和题目整理(3)

来源:互联网 发布:淘宝法务部电话 编辑:程序博客网 时间:2024/05/22 02:36

1、将一颗有100节点的完全二叉树从上到下,从左到右依次对节点进行i比那好,根节点编号为1,则编号为49的节点的左孩子编号为()

计算方式:log2(49)=5+17,根节点为2的0次方,即49节点是第2的6次方层第16个节点,则他的左孩子应该在第2的7次方层,可以计算为2的7次方加 17*2 得出左孩子编号为

2的7次方+17*2=98.

2、针对二维数组的求地址题目,对此整理出计算方式: (1)对称矩阵Ann ,以行为主序存储 A的下三角部分 首地址为locA[1][1] 每个元素占L个单元,则任意元素地址为

 LOC(A[I][J])=locA[1][1] +(i*(i-1)/2)+(j-1)*L   当i≥j ;否则,LOC(A[I][J])=locA[1][1] +(j*(j-1)/2)+(i-1)*L 。(2) 上三角矩阵Ann以行为主序存储,首地址为locA[1][1] 每个元素占L个单元,任意元素地址为:LOC(A[I][J])=locA[1][1] +((2n-i+2)*(i-1)/2)+(j-i))*L (当1≤i≤j,首地址为A[0][0] ,改为 (2n-i+1)*i) (3)二维数组A[0..m-1][0...n-1],以列为主序存储,则任意元素地址为 LocA[0][0]+(j*m+i)*d,若以行为主序 改为 i*n+j

3、对于给定的一组关键字(12,2,16,30,8,28,4,10,20,6,18),求出每种算法第一趟排序后的结果:希尔排序(5):快速排序(第一个为基准元素):基数排序(基数为10):

二路并归排序:()堆排序:()

计算方法:希尔排序定义:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。 当然,光看这定义可能不理解,下面我给出详细计算过程,增量为5,首先第一个(记为A1)数值为 12,找出A1+5的数值(即第六个),为28,两者相比较,28大,所以不变化,在比较A2,与A7,2与4,不变,继续比较A3与A8,16大于10,交换位置,再比较A4与A9,30大于20,交换位置,再比较A5与A10,8大于6,交换,比较A6与A11,注意,此时如果A1与A6交换过,则使用的A6是当前交换后的值,目前没交换,所以不变,28大于18,交换,得出结果为 12  2  10  20 6  18 4  16 30  8  28.

快速排序: 比较简单,就是用第一个数组12,不停的比较,比他大放他后面,比他小放他前面。得出 6,2,10,4,8,12,28,30,20,6,18

基数排序:计算方式:

第一步

以LSD为例,假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39
第二步

接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
第三步

接下来将这些桶子中的数值重新串接起来,成为以下的数列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。

简单说就是,因为是10进制,所以先拍个位数大小,再拍十位数大小,因为只是第一步,所以只排了个位数,即 30 10 20 12 2 4 16 6 8 28 18

二路并归:原理:归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。
如 设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11,;
逆序数为14;

归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾

即 第一步将数组中 两两比较, 12 与2比较,16与30比较,依次类推,18被剩下先不管,第一次排序后为,2,12 16 30 8 28 4 10 6 20 18

堆排序:

堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。
(1)用大根堆排序的基本思想
① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
……
直到无序区只有一个元素为止。
(2)大根堆排序算法的基本操作:
① 初始化操作:将R[1..n]构造为初始堆;
② 每一趟排序的基本操作:将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。

详细参考,http://blog.csdn.net/morewindows/article/details/6709644 ,http://blog.csdn.net/clam_clam/article/details/6799763,因此,第一步应该建一个小堆或者大堆,可以建一个小堆如:2 6  4 10 8 28 16 30 20 12 18


0 0
原创粉丝点击