- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
4、若有n个元素的序列近似有序,即除掉少数K个元素后是有序序列且Kn,在冒泡排序、快速排序、直接插入排序、堆排序方法中,请给出哪些方法不适合,哪些方法最快最适合,简述原因。
【参考解答】在待排序列近似有序的情况下,快速排序、堆排序都不太适合,直接插入排序、冒泡排序比较快。因为在这种情况下,快速排序接近最坏情况,时间复杂度接近O(n2),堆排序的时间复杂度仍然是O(nlogn),相反,由于比较和移动次数较少,直接插入排序和冒泡排序的时间复杂度接近O(n)(这里假设冒泡排序在一趟排序没有交换发生时结束。)
五、
设主串s和子串t分别以单链表存储,t和s 中每个字符均用一结点表示(如图)。即求:子串t在主串s中第一次出现的位置指针。
data Next
【分析】思路类似简单模式匹配算法,但是,链表不像数组那样方便(i=i-j+2)回溯,所以应该增加一个指针变量(如下程序中的指针变量 ps),记录每一趟开始匹配的起点。
【参考解答】采用简单模式匹配算法的思路,为方便回溯,增加一个指针变量记录每一趟匹配开始的位置。
// 字符结点结构
struct LNode {
char data;
LNode *next;
};
// 链式存储的字符串类型(相当于不带头结点的单链表)
typedef LNode *LString;
// 字符串模式匹配
// 在主串s中查找子串t首次出现的位置,并返回指示该位置的指针
LString LSIndex(const LString s, const LString t) {
// 从主串s每个字符结点ps开始匹配子串t
LString ps = s; // 记录主串中开始匹配的起始位置
LString pi = ps;
LString pj = t;
while (pi pj) {
if (pi-data == pj-data) {
pi = pi-next;
pj = pj-next;
} else { // 失配时回溯到主串的下一个字符
ps = ps-next;
pi = ps;
pj = t;
}
}
// 如果匹配成功返回主串中匹配的起始位置
if (pj == NULL)
return ps;
else
return NULL;
}
1.分别采用堆排序、快速排序、直接插入排序、归并排序算法对初始状态为递增序列的表按递增顺序排序,给出最省时间与最费时间的算法名称,简述原因。
?【参考解答】对初始状态为递增序列的表按递增顺序排序,(1)直接插入排序最省时间。因为算法此时总的比较次数为n-1,移动次数为0,为最好情况,是最省时间的。(2)快速排序最费时间。待排序列有序时,快速排序退化为冒泡排序,时间复杂度为O(n2)。而堆排序和归并排序的时间复杂度都是O(nlogn)。所以,此时快速排序最费时间。
4.只想得到N个元素序列中第K个最大元素之前的部分递减有序序列(KN),列出3种速度快的方法名称与原因。
【分析】总的思路是尽量避免对所有N个元素排序,从而提高算法的速度。因为对N个元素进行快速排序、堆排序或归并排序,(平均)时间复杂度均为O(pNlogN),p为某个常数,所以,所谓速度快的方法,时间复杂度应该更低。
另外,关于方法名称,求前K个最大元素并非我们(本科阶段)通常所学的经典算法,因此所谓名称,也只能借用其他算法之名。因此,可以认为下面几种方法分别借用了(1)简单选择排序,(2)插入排序,(3)、(4)堆排序,(5)快速排序划分算法。
【参考解答】几种可能的方法如下:
(1)K趟简单选择排序,依次选出最大的K个元素,时间复杂度O(KN)。由于K远小于N,特别是当Kplog2N时(其中p为某个常数),该算法要比对整个序列排序的方法更快。
(2)首先取K个元素,逆序排序,作为已经求得的K个极大元素的递减序列S。对其余N-K个元素,逐个与该序列的最小(最后一个)元素Sk比较,如果小于Sk则丢弃,如果大于Sk则从序列S中删除Sk,然后将该元素插入序列S合适的位置,保持整个序列逆序。
K个元素排序的时间复杂度为O(KlogK) ,其余N-K个元素都至少进行一次比较,最坏情况下总共要花费O(K(N-K))的时间插入序列S中。所以总的时间复杂度为O(KlogK+K(N-K))。若K远小于N,时间复杂度近似为O(KN)。
用堆代替方法(2)中的序列S,可以得到:
(3)首先取K个元素,建立小顶堆H,堆顶H1为K个元素中最小元素。对其余N-K个元素,逐个与堆顶元素H1比较,若小于H1则丢弃,若大于H1,则以该元素替换H1,并执行一次筛选,将H重新调整为小顶堆。最后,可以H中得到N个元素中最大的K个元素,在已建立的堆H的基础上
文档评论(0)