CLRS 第六章思考题

来源:互联网 发布:上海软件编程培训机构 编辑:程序博客网 时间:2024/06/11 12:21

思考题6-1

a) 不一样,比如 A[1,2,3] 分别用BUILD_MAX_HEAPBUILD_MAX_HEAP'分别变成:

BUILD_MAX_HEAP
这里写图片描述

BUILD_MAX_HEAP'
这里写图片描述

b) 调用MAX_HEAP_INSERTO(lgn),需要调用 n1次,所以上界 O(nlgn),对于下界,当数组严格递增的时候,每次调用MAX_HEAP_INSERT将引起HEAP-INCREASE-KEY一直到根结点。结点 i 的深度 lgi。所以:

i=2nlgi=lg(n!)=Θ(nlgn)

思考题6-2

a) 根是 A[1],它是孩子分别是 A[2]A[d+1],它孩子结点的孩子结点分别是 A[d+2]A[d2+d+1]DPARENT(i)=(i2)/d+1,DCHILD(i,j)=d(i1)+j+1(ij)

b) Θ(logdn)

c) 伪代码如下:

MAX-HEAPIFY(A, i)    largest = i    for j = 1 to d        c = CHILD(i, j)        if (c <= A.heap-size && A[c] > A[largest])            largest  = c    if i != largest         exchange A[i] with A[largest ]        MAX-HEAPIFY(A, largest )EXTRACT-MAX(A)    if A.heap-size < 1        error "heap underflow"    max = A[1]    A[1] = A[A.heap-size]    A.heap-size = A.heap-size - 1    MAX-HEAPIFY(A, 1)    return max

时间复杂度 O(logdn)

d)伪代码如下:

INCREASE-KEY(A, i, key)    if key < A[i]        error "new key is smaller than current key"    A[i] = key    while i > 1 && A[i] > A[PARENT(i)]        exchange A[i] with A[PARENT(i)]        i = PARENT(i)INSERT(A, key)    A.heap-size = A.heap-size + 1    A[A.heap-size] = -∞    INCREASE-KEY(A, A.heap-size, key)

时间复杂度 O(logdn)

e) 参见d)。

思考题6-3

a) 最简单的方法就是先排序,然后按照顺序从左到右,从上到下依次填充数字,不够的位置填上无穷大。

281639412514

b) 由于 Y[1,1] 是矩阵中最小的元素(若矩阵存在),当 Y[1,1]=,则其余元素也必定是无穷大,则 Y 为空。同理,当 Y[mn]< 时,Y 是满的。

c) 首先保存 Y[1,1],然后将 Y[m,n] 赋值给 Y[1,1],同时令Y[m,n]=。接着从 Y[1,1] 进行调整。类似于堆调整,假设当前元素为 Y[i,j],取 Y[i+1,j]Y[i,j+1] 的较小值 x,若 Y[i,j]<x,则将 Y[i,j]Y[i+1,j]Y[i,j+1] 的较小值进行交换,这样一直比较,直到 Y[i,j]Y[i+1,j]Y[i,j+1] 都小则停止。
最坏情况下左上的元素要移到右下,共 m+n2 次交换,所以时间复杂度为 O(m+n)

d) 和 c) 类似,只是每次插入到 Y[m,n] 中,然后调整,每次和它上边与左边的元素进行比较,找出它上边和左边较大的数 x,若 x 比与调整的数要大,则交换,否则停止。
最坏情况下右下的元素要移到左上,共 m+n2 次交换,所以时间复杂度为 O(m+n)

e) 先建一个 n×n 的矩阵,全部赋值为 ,需要 O(n2),然后依次插入到这个矩阵中,每个元素 O(n+n)=O(n),因此需要 n2O(n)=O(n3)

f) 从左下角开始,将关键字和当前值比较,key>current 则向右移动,key<current 则向上移动,key==current 则找到。当到达矩阵最上边或者最右边还没找到,则说明没有此元素。
最坏情况从左下到右上,复杂度 O(m+n)

实际代码如下:

#include <iostream>#include <limits>using std::cin;using std::cout;using std::endl;void init_Young(int **array,int m,int n){    for(int i = 0; i < m; ++i)        for(int j = 0; j < n; ++j)            array[i][j] = INT_MAX;}void Youngify(int **array,int m,int n,int i,int j)  //数组m行n列,调整的元素位置i行j列{    while(1)    {        int i_1 = i, j_1 = j;        if(i + 1 < m && array[i][j] > array[i+1][j])            i_1 = i + 1;        if(j + 1 < n && array[i][j] > array[i][j+1])            j_1 = j + 1;        if(i_1 != i || j_1 != j)        {            if(array[i_1][j] < array[i][j_1])   //array[i][j]和其中较小的数交换                j_1 = j;            else i_1 = i;            int temp = array[i][j];            array[i][j] = array[i_1][j_1];            array[i_1][j_1] = temp;            i = i_1;            j = j_1;        }        else break;    }}int Young_EXTRACT_MIN(int **array,int m,int n){    int smallest = array[0][0];    array[0][0] = array[m-1][n-1];    array[m-1][n-1] = INT_MAX;    Youngify(array,m,n,0,0);    return smallest;}void Young_DECREASE_KEY(int **array,int m,int n,int i,int j,int key){    if(array[i][j] < key)        return;    array[i][j] = key;    while(1)    {        int i_1 = i, j_1 = j;        if(i - 1 >= 0 && array[i][j] < array[i-1][j])            i_1 = i - 1;        if(j - 1 >= 0 && array[i][j] < array[i][j-1])            j_1 = j - 1;        if(i_1 != i || j_1 != j)        {            if(array[i_1][j] > array[i][j_1])   //array[i][j]和其中较大的数交换                j_1 = j;            else i_1 = i;            int temp = array[i][j];            array[i][j] = array[i_1][j_1];            array[i_1][j_1] = temp;            i = i_1;            j = j_1;        }        else break;    }}void Young_INSERT(int **array,int m,int n,int key){    Young_DECREASE_KEY(array,m,n,m-1,n-1,key);}void Young_SORT(int **Young,int m,int n,int **array){    for(int i = 0; i < m; ++i)        for(int j = 0; j < n; ++j)            Young_INSERT(Young,m,n,array[i][j]);}bool Young_FIND_ELEMENT(int **Young,int m,int n,int key){    int i = m - 1, j = 0;    while(i >= 0 && j < n)    {        if(Young[i][j] < key)            ++j;        else if(Young[i][j] > key)            --i;        else return true;    }    return false;}int main(){    int **Young = new int *[2];    for(int i = 0; i < 2; ++i)        Young[i] = new int[3];    init_Young(Young,2,3);    int **array = new int *[2];    for(int i = 0; i < 2; ++i)        array[i] = new int[3];    for(int i = 0; i < 2; ++i)    {        for(int j = 0; j < 3; ++j)        {            int key;            cin >> key;            array[i][j] = key;        }    }    Young_SORT(Young,2,3,array);    int value;    cout << "Enter the key you want to find:";    cin >> value;    if(Young_FIND_ELEMENT(Young,2,3,value))        cout << "yes" << endl;    else cout << "no" << endl;    cout << Young_EXTRACT_MIN(Young,2,3);    for(int i = 0; i < 2; ++i)    {        delete []Young[i];        delete []array[i];    }    delete []Young;    delete []array;    return 0;}
0 0
原创粉丝点击