`
holoblog
  • 浏览: 1226060 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:18917
文章分类
社区版块
存档分类
最新评论

linear线性级排序算法

 
阅读更多

线性级排序算法

需求:需要找到前m个大数,这m个数必须有序。现在有n个数(n>>m)。可以使用大空间但是空间远小于n。这里的含义是连同这n个数都不要占用n的空间。因为数据量太大了。N个数是一个一个生成的。

思考:

1. m个数有序,这当然不是一个排序问题,或者是一个部分排序问题。已知的排序是冒泡,插入,选择,归并,快速和基数排序。

2. 冒泡效率低。选择排序的要求是这n个数已经存在,并且需要的空间(包括这n个数的存储空间)肯定大于n。快排,虽然在找第k的数是klogk的复杂度也就是线性级O(n)。但是它还是需要O(n)的空间。归并排序,基数排序也是同样如此。

3. 插入排序要求,元素是要移动的。所以插入的移动数据复杂度是O(n2)。所以这里要改进下插入排序。要将插入变为O(1)。那么就要使用链表。而且数据是一个一个生成的,那么小的数据插入在大的数据后面。这样就完成了排序任务。

4. 另外设置固定长度为l,可以认为即使是大数据量n,也有cl=n/l,其中cl为较小常数。

部分伪代码:

public static void Sort (LinkedList lsort ,double num)

{

if(lsort.size() == 0 )

{

lsort.add(0, num);

return;

}

for(int i = 0; i < m && i< lsort.size(); i++)

{

if(num > lsort.get(i))

{

lsort.add(i,num);

break;

}

}

// remove no used sort object

if(lsort.size() == maxSize)

{

int startIndex = maxSize - fileSetNum;

while(startIndex -- != 0)

{

lsort.removeLast();

}

}

}

我们下面对上面的这段代码进行分析,因为使用链表,所以插入删除的复杂度为O(1),查找的复杂度为O(m)但是会包含在第二段代码中:

if(lsort.size() == 0 )

{

lsort.add(0, num);

return;

}

这段代码的时间复杂度明显是O(1)

for(int i = 0; i < m && i< lsort.size(); i++)

{

if(num > lsort.get(i))

{

lsort.add(i,num);

break;

}

}

这段代码中m个数为常数。所以这个进行比较的时间复杂度最差为O(m),即只与前m个数进行比较。

// remove no used sort object

if(lsort.size() == l)

{

int startIndex = l – m;

while(startIndex -- != 0)

{

lsort.removeLast();

}

}

这段代码是为了减少存储空间。当空间达到l时,将会释放l-m个空间。使得存储空间不会到达n。这段代码的时间复杂度为O(l-m)但是因为这段代码不是经常执行,要在链表长度到达l时才会执行,所以分摊到各个执行上其复杂度为O((l-m)*l/n).

当此段代码需要访问n次。

所以总复杂度为各个复杂度加和再乘n为:n*(O(1)+ O(m)+O((1-m)*l/n)) = O(n+mn+(1-m)*l)=O(mn),因为m为常数,所以故为O(n)

总结:

根据已有的算法知识,做出符合需求的算法。并且这个算法的时间复杂度也很理想。在实际运行过程中达到了很好的效果。使用java测试。在290000条待排序的数据中,时间消耗在700ms左右。

分享到:
评论

相关推荐

    常用算法(python)

    线性查找(Linear Search) 素字符串匹配算法(Naive String Matching) KMP 算法(Knuth-Morris-Pratt) Rabin-Karp 算法 Boyer-Moore 算法 A* 搜索算法 Dijkstra 算法 Bellman-Ford 算法 Floyd-Warshall 算法 ...

    linear-counter:线性计数器C ++实现

    该算法不需要存储和排序所有给定的条目,并且具有O(1)的空间复杂度和O(N)的时间复杂度,这比使用| sort | uniq | wc -l更快| sort | uniq | wc -l | sort | uniq | wc -l | sort | uniq | wc -l 。安装在macOS...

    LinearSearch:一种轻量级的学习算法,用于搜索同类项目列表

    LinearSearch合并了先前搜索选择的线性组合,以帮助对搜索结果进行排序。 searchScore = textualCloseness * weight + numberOfPicksInLastN * weightN + ... 默认情况下,LinearSearch使用与Sublime Text中的算法...

    算法导论(第2版)参考答案

     第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构(Data Structures)  第十章 基本的数据结构(Elementary Data ...

    算法导论(英文版)

    第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的数据结构(Elementary Data ...

    算法导论(part1)

    ·快速排序(第7.1节)中用到的划分方法与期望线性时间顺序统计算法(expected linear-time order-statistic algorithm,第9.2节)有所变化。现在,我们采用了Lomuto提出的方法,并将该方法与指示器随机变量一起使用,...

    算法导论(part2)

    ·快速排序(第7.1节)中用到的划分方法与期望线性时间顺序统计算法(expected linear-time order-statistic algorithm,第9.2节)有所变化。现在,我们采用了Lomuto提出的方法,并将该方法与指示器随机变量一起使用,...

    算法导论-第三版(中文).rar

    第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的数据结构(Elementary Data ...

    算法导论-麻省理工(中文)

     第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构(Data Structures)  第十章 基本的数据结构(Elementary Data ...

    第2章 分治策略1(MIT课件)

    递归 分治法基本思想 二分搜索算法 BinarySearch 合并排序算法 MergeSort 快速排序算法 QuickSort 线性时间选择 Selection in Linear Time

    ACM 算法模板集

    6. Modular Linear Equation模线性方程(同余方程) 7. Chinese Remainder Theorem中国余数定理(互素于非互素) 8. Euler Function欧拉函数 9. Farey总数 9. Farey序列构造 10. Miller_Rabbin素数测试,Pollard_rho因式...

    算法导论第三版英文原版

    第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的数据结构(Elementary Data ...

    leetcode中国-np-algorithm:数据结构和算法

    leetcode中国 ...最简单的排序算法:选择排序法 [无代码] 3-2 实现选择排序法 3-3 使用带约束的泛型 3-4 使用 Comparable 接口 3-5 选择排序法的复杂度分析 3-6 作业:换个角度实现选择排序法 [无代

    算法导论Introduction to Algorithms

    第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的数据结构(Elementary Data ...

    算法导论(原书第二版)

    第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的数据结构(Elementary Data ...

    算法导论(中文 第二版)答案

     第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构(Data Structures)  第十章 基本的数据结构(Elementary ...

    算法导论Introduction.to.Algorithms,.Second.Edition.part2(英文)

     第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构(Data Structures)  第十章 基本的数据结构(Elementary Data ...

    算法导论Introduction.to.Algorithms,.Second.Edition.part1(英文版)

     第八章 线性时间中的排序(Sorting in Linear Time)  第九章 中值与顺序统计(Medians and Order Statistics)  第三部分(Part III) 数据结构(Data Structures)  第十章 基本的数据结构(Elementary Data ...

    数据结构、算法与应用:C++语言描述(原书第2版)第二部分

    18.4.2 排序算法的下限 第19章 动态规划 19.1 算法思想 19.2 应用 19.2.1 0/1背包问题 19.2.2 矩阵乘法链 19.2.3 所有顶点对之间的最短路径 19.2.4 带有负值的单源最短路径 19.2.5 网组的无交叉子集 19.3 参考及推荐...

Global site tag (gtag.js) - Google Analytics