在一个有N个元素的单链表中找出倒数第K 个元素

来源:百度知道 编辑:UC知道 时间:2024/05/06 02:55:29
要求时间复杂度为O(n),救急的啊,亲爱的兄弟姐妹们!!!!!!!!!!!!!

诡异的很.
已经知道有N个元素了? 那倒数跟正数有什么区别? 倒数第K个, 就是正数第 N-K+1个, 那指针从头节点开始移动, 移动 N-K+1 返回的就是所要元素了.
如果不知道有多少个元素的话, 只能建一个队列了, 队列的长度为K, 用指针从头结点开始搜索, 然后一个一个结点开始进队, 队列满了就前面的出去. 到指针指向尾结点的时候, 队列的第一个元素就是倒数第K个了.
具体的算法就自己写吧. 也不复杂.

计算数组中第i大小元素的select算法:
将n个输入元素划分成「n/5」个组,每组5个元素,只可能有一组元素不是5个。用任意一种排序算法,将每组中的元素排好序,并取每组的中位数,共「n/5」个。
递归调用算法select来找出这「n/5」个元素的中位数。如果「n/5」是偶数,就找它的两个中位数中较大的一个。以这个元素x作为划分基础。
每次数组a[p,r]被划分成为两个子数组a[p:x]和a[x+1:r],使得a[p:x]中元素都不大于a[x+1:r]中元素。接着计算a[p:x]中元素个数,如果小于i则对a[x+1:r]进行下一次操作,如果大于等于i则对a[p:x]进行下一次操作。
算法分析:
因为每次找出的基准x至少比3[(n-5)/10]个元素大,至少比3[(n-5)/10]个元素小,当n≥75时,3[(n-5)/10]≥n/4。所以按此基准划分所得的两个子数组的长度都至少缩短1/4。
于是,按照算法所选的基准进行划分所得到的2个子数组分别至多有3n/4个元素。设对n个元素调用算法select需要T(n)的时间,找中位数x至多用了T(n/5)的时间,无论对哪个子数组调用函数都至多用T(3n/4)。至
得到递归式:
T(n)≤C n<75
T(n)≤C*n+T(n/5)+T(3n/4) n≥75
解得递归式可得T(n)=O(n)。

找本算法书吧,里面一般是有的

设计一个算法用不多于3n/2的平均比较次数,在数组A〔1...n〕中找出最大和最小值的元素! 有15个数那从大到小顺序排列存放在1个数组中,输入一个数找出该数是这个数组的第几个元素的值 有15个数按小到大的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数组中第几个元素的值. 有15个数存放在一个数组中,输入一个数,要求用半查找法找出该数是数组中第几个元素的值。 给定有n个元素的向量,建立一个有序单链表的时间复杂度是 有一个4*4矩阵 找出其中的最大元素和最小元素 编写一个函数,找出数组a[n]中最大元素和最小元素所在的下标,并返回给主调函数。 从4N个 不同元素中 取出N个元素 特定元素的组合个数 先针构造一个有n个元素组成的有序(按照元素数升序)单项链表,并将打印出来。 有一个数组.内放10个整数,要求找出最小的数和它的下标,然后和数组中最前面的元素对换.