知识大全 第9章查找(二)习题练习答案
Posted 结点
篇首语:我认为知识是一切能力中最强的力量。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 第9章查找(二)习题练习答案相关的知识,希望对你有一定的参考价值。
设散列表长度为 散列函数h(x)=x% 给定的关键字序列为 试画出分别用拉链法和线性探查法解决冲突时所构造的散列表 并求出在等概率情况下 这两种方法查找成功和失败时的平均查找长度 请问装填因子的值是什么? 答 ( )拉链法如下图 T[ ] ┌──┐ │ │→ → →∧ ├──┤ │ │→ → → → ∧ ├──┤ │ │→ →∧ ├──┤ │ ∧ │ ├──┤ │ ∧ │ ├──┤ │ │→ → →∧ ├──┤ │ ∧ │ ├──┤ │ ∧ │ ├──┤ │ ∧ │ ├──┤ │ ∧ │ ├──┤ │ ∧ │ └──┘ ( )线性探查法如下图 下标 ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐ T[ ]│ │ │ │ │ │ │ │ │ │ │ │ └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ 探查次数 用拉链法的查找成功平均查找长度为 ASLsucc=( * + * + * )/ = 查找失败时平均查找长度为 ASLunsucc=( + + + + + + + + + + )/ = 用线性探查法查找成功时平均查找长度为 ASLsucc=( + + + + + + + )/ = 查找失败时平均查找长度为 ASLunsucc=( + + + + + + + + + + )/ = 装填因子α拉链= / = α线性探查= / =
假定有k个关键字互为同义词 若用线性探查法把这些同义词存入散列表中 至少要进行多少次探查?答 至少要进行 + + +k +k次探查 也就是说 在散列表的一连串连续空间内 第一个关键字只需探查一次 第二个就要探查 次 如此这般 第k个关键字就要探查k次才能找到位置存放 所以至少要把它们全加起来才够
为什么说当装填因子非常接近 时 线性探查类似于顺序查找?为什么说当装填因子比较小(比如α= 左右)时 散列查找的平均查找时间为O( )?答 当α非常接近 时 整个散列表几乎被装满 由于线性探查法在关键字同义时解决冲突的办法是线性地向后查找 当整个表几乎装满时 它就很类似于顺序查找了 当α比较小时 关键字碰撞的几率比较小 一般情况下只要按照散列函数计算出的结果能够 次性就找到相应结点 因此它的平均查找时间接近于
设顺序表中关键字是递增有序的 试写一顺序查找算法 将哨兵设在表的高下标端 然后求出等概率情况下查找成功与失败时的ASL 答: typedef struct KeyType key InfoType otherinfo //此类型依赖于应用 NodeType typedef NodeType SeqList[n+ ] //n号单元用作哨兵 int SeqSearch(Seqlist R KeyType K) //在关键字递增有序的顺序表R[ n ]中顺序查找关键字为K的结点 //成功时返回找到的结点位置 失败时返回 int i R[n] key=K //设置哨兵 for(i= R[i] key<=K;i ) //从表前往后找 if (i<n&&R[i] key==K) return i; //R[i]是要找的结点 else return //SeqSearch 等概率情况下查找成功ASL=( + + +…+n)/n 等概率情况下查找失败时的ASL=( + + +…+n+n+ )/(n+ )
试写出二分查找的递归算法 解 int BinSearch(SeqList R KeyType K int low int high) //在有序表R[low high]中进行二分查找 成功时返回结点的位置 失败时返回零 int mid //置当前查找区间上 下界的初值 if (low<=high) //当前查找区间R[low high]非空 mid=(low+high)/ if(R[mid] key==K) return mid //查找成功返回 if(R[mid] kdy>K) return BinSearch( R K low mid )//在R[low mid ]中查找 else return BinSearch( R K mid+ high) //在R[mid+ high]中查找 return //当low>high时表示查找区间为空 查找失败 //BinSeareh
试写一算法判别给定的二叉树是否为二叉排序树 设此二叉树以二叉链表为存储结构 且树中结点的关键字均不相同 解 由二叉排序树的定义可得 二叉排序树中左子树的所有结点的值都小于根结点的值 所有右子树中结点的值都大于根结点的值 那么只要对待判定的二叉树中的结点按层遍历并判断即可 在该算法中要用到队列保存已遍历的结点指针 typedef BinTNode *DataType;//循环队列中元素为二叉树结点指针 int BinSortStree(BinTree T) CirQueue Q; BinTNode *p; if (!T) return ;//空树为二叉排序树 InitQueue(&Q); EnQueue(&Q T); while(!QueueEmpty(&Q)) p=DeQueue(&Q); if (p >lchild) if (p >data<p >lchild >data) return ;//不是二叉排序树 else EnQueue(&Q p >lchild); if (p >rchild) if (p >data>p >rchild >data) return ;//不是二叉排序树 else EnQueue(&Q p >rchild); return ;//是二叉排序树
试写一递归算法 从大到小输出二叉排序树中所有其值不小于x的关键字 要求算法的时间为O(lgn+m) n为树中结点数 m为输出关键字个数(提示 先遍历右子树 后遍历左子树) 答 typedef int KeyType //假定关键字类型为整数 typedef struct node //结点类型 KeyType key //关键字项 InfoType otherinfo //其它数据域 InfoType视应用情况而定 下面不处理它 struct node *lchild *rchild //左右孩子指针 BSTNode typedef BSTNode *BSTree void OUTPUTNODE(BSTree T KeyType x) //从大到小输出二叉排序树中所有其值不小于x的关键字 if (T) OUTPUTNODE( T >rchild x); if (T >key>=x) printf( %d T >key); OUTPUTNODE( T >Lchild x);
写一个遍历B 树的算法 使输出的关键字序列递增有序 算法中的读盘操作可假定为DiskRead 答 #define Max l //结点中关键字的最大数目 Max=m m是B 树的阶 #define Min //非根结点中关键字的最小数目 Min=「m/ ( typedef int KeyType //KeyType应由用户定义 typedef struct node //结点定义中省略了指向关键字代表的记录的指针 int keynum //结点中当前拥有的关键字的个数 keynum<=Max KeyType key[Max+ ] //关键字向量为key[ keynum] key[ ]不用 struct node *parent //指向双亲结点 struct node *son[Max+ ] //孩子指针向量为son[ keynum] BTreeNode typedef BTreeNode *BTree void travelBtree(BTree T) //按关键字递增序输出B 树序列 int i; if (T) for(i= ;i<=T >keynum;i++)//T >keynum个关键字的结点有T >keynum+ 棵子树 if (T >son[i]) DiskRead(T >son[i]);//读入根结点的第i棵子树 travelBtree(T >son[i]);//遍历第i棵子树 if (i<T >keynmu)//若刚遍历的子树不是最后一棵子树 printf( %d T >key[i+ ];
相关参考
对含有n个互不相同元素的集合同时找最大元和最小元至少需进行多少次比较? 答 设变量max和min用于存放最大元和最小元(的位置)第一次取两个元素进行比较大的放入max小的放入min从第次开
对含有n个互不相同元素的集合同时找最大元和最小元至少需进行多少次比较? 若对具有n个元素的有序的顺序表和无序的顺序表分别进行顺序查找试在下述两种情况下分别讨论两者在等概率时的平均查找长度&n
常见的文件组织方式有哪几种?各有何特点?文件上的操作有哪几种?如何评价文件组织的效率?答 常用的文件组织方式有顺序文件索引文件散列文件和多关键字文件 ●顺序文件的
试描述头指针头结点开始结点的区别并说明头指针和头结点的作用答 开始结点是指链表中的第一个结点也就是没有直接前趋的那个结点 链表的头指
将哨兵放在R[n]中被排序的记录放在R[n]中重写直接插入排序算法解 重写的算法如下 voidInsertSort(SeqListR) //对顺序表中记录
以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态 ()直接插入排序()希尔排序()冒泡排序()快速排序 ()直接选择排序()堆排序()归并排序()基数排序 上述方法中哪些
请按行及按列优先顺序列出四维数组A***的所有元素在内存中的存储次序开始结点为a 解 按行优先的顺序排列时先变化右边的下标也就是右到左依次变化这个四维数组的排列是这样的(将这个排列分行写出
常见的文件组织方式有哪几种?各有何特点?文件上的操作有哪几种?如何评价文件组织的效率?索引文件散列文件和多关键字文件适合存放在磁带上吗?为什么?设有一个职工文件其记录格式为(职工号姓名性别职务年龄工资
以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态 ()直接插入排序()希尔排序()冒泡排序()快速排序 ()直接选择排序()堆排序()归并排序()基数排序 上述方法中哪些
一基础知识题试描述头指针头结点开始结点的区别并说明头指针和头结点的作用何时选用顺序表何时选用链表作为线性表的存储结构为宜?在顺序表中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因