算法

【算法】排序算法之快速排序

巧了我就是萌 提交于 2020-02-06 08:58:41
概念 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用 分治法 (Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。 快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。虽然 Worst Case 的时间复杂度达到了 O(n²),但是人家就是优秀,在大多数情况下都比平均时间复杂度为 O(n logn) 的排序算法表现要更好,可是这是为什么,在《算法艺术与信息学竞赛》上找到了满意的答案: 快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。 算法步骤

数据结构之算法时间复杂度

半城伤御伤魂 提交于 2020-02-06 05:30:39
原文链接 算法的时间复杂度定义为: 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间量度,记作:T(n}=0(f(n))。它表示随问题规模n的增大,算法执行时间的埔长率和 f(n)的埔长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。其中f( n)是问题规横n的某个函数。 根据定义,求解算法的时间复杂度的具体步骤是: 找出算法中的基本语句   算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。 计算基本语句的执行次数的数量级   只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。 用大Ο记号表示算法的时间性能   将基本语句执行次数的数量级放入大Ο记号中。 如何推导大o阶呢?我们给出了下面 的推导方法: 1.用常数1取代运行时间中的所有加法常数。 2.在修改后的运行次数函数中,只保留最髙阶项。 3.如果最高阶项存在且不是1,则去除与这个项相乘的常数。 简单的说,就是保留求出次数的最高次幂,并且把系数去掉。 如T(n)=2n^2+n+1 =O(n^2) 例如: #include "stdio.h" int main

机器学习入门之决策树算法

最后都变了- 提交于 2020-02-06 04:16:01
1、什么是决策树(Decision Tree) 决策树是一个类似于流程图的树结构,其中每一个树节点表示一个属性上的测试,每一个分支代表一个属性的输出,每一个树叶节点代 表一个类或者类的分布,树的最顶层是树的根节点。 举一个例子。小明同学想根据天气情况是否享受游泳运动: 这里包含了6个属性,一条样例即为一个实例,待学习的概念为“是否享受运动”,学习目标函数:f:X->Y。 根据上面的表中实例,我们可以试着用一个树结构的流程图来表示小明根据那6个属性决定是否享受运动: 从上面这个树状图中,我们可以看到,总共的实例有14个(出去运动的实例有9个,不运动的实例有5个),从树顶往下看,首先看到菱形的选项,意思是天气如何?然后分出了三个分支——晴天,阴天,雨天。实例中是天气属性为晴天,并决定要去运动的有2个,不去运动的有3个;天气属性为阴天,并决定去运动的有4个,不运动的有0个;天气属性为雨天,并决定去运动的有3个,不运动的有2个。从图中我们可以看到,当标记中的正例或者反例为0个时,树就不继续往下扩展了(比如天气属性为阴天的时候,不去运动的实例为0个)。假如正例或者反例都不为0时,那么就要根据属性继续往下扩展树。 决策树是机器学习中分类方法中的一个重要算法。 2、如何构造一个决策树算法 (1)信息熵 信息是一种抽象的概念,那么如何对信息进行一个量化的操作呢?1948年,香农提出了“信息熵

JS数组去重的6种算法实现

风格不统一 提交于 2020-02-06 04:04:37
1.遍历数组法 最简单的去重方法,实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中;注意点:判断值是否在数组的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,需多写一些兼容低版本浏览器代码,源码如下: var arr = [1,3,5,7,9,1,9,5,9,3,5,11,13]; function unique1(array){ var newArr=[];//新建一个新数组 //遍历参数数组array for(var i=0;i<array.length;i++){ //判断新数组是否有这个元素值,没有的话,就把arr[i]给push到新数组newArr中 if(newArr.indexOf(array[i])===-1){ newArr.push(arr[i]); } } return newArr; } console.log(unique1(arr)); 效果如下: 2.对象键值对法 该方法执行的速度比其他任何方法都快, 就是占用的内存大一些,实现思路:新建一js对象以及新数组,遍历传入数组时,判断值是否为js对象的键,不是的话给对象新增该键并放入新数组。注意 点: 判断是否为js对象键时,会自动对传入的键执行“toString()”,不同的键可能会被误认为一样;例如: a[1]、a["1"] 。解决上述问题还是得调

C++模板排序算法

旧时模样 提交于 2020-02-06 03:31:47
交换函数 template < typename SORTVALUE > void commonswap ( SORTVALUE & exchange1 , SORTVALUE & exchange2 ) { SORTVALUE value ( exchange2 ) ; exchange2 = exchange1 ; exchange1 = value ; } 冒泡排序 template < typename SORTVALUE > void BubbleSort ( SORTVALUE sortBegin , SORTVALUE sortEnd ) { for ( int i = 0 ; i < sortEnd - sortBegin - 1 ; ++ i ) { for ( int j = 0 ; j < sortEnd - sortBegin - 1 - i ; ++ j ) { if ( ( * ( sortBegin + j ) > * ( sortBegin + j + 1 ) ) ) { commonswap ( * ( sortBegin + j + 1 ) , * ( sortBegin + j ) ) ; } } } } 插入排序 template < typename SORTVALUE > void InsertSort ( SORTVALUE

设计模式

余生长醉 提交于 2020-02-06 01:51:04
设计原则 1. 找出应用中可能需要变化之处,把它们独立出来,不要和那些不要变化的代码混在一起。(封装变化) 2. 针对接口编程,而不是针对实现编程。 3. 多用组合,少用继承 4. 为了交互对象之间的松耦合设计而努力(改变一方,并不会影响另一方,观察者模式) 5. 开放-关闭原则 类应该对扩展开放,对修改关闭。(装饰者模式) 6. 要依赖抽象,不要依赖具体类(依赖倒置原则,不能让高层组件依赖低组件,不管高层或者低层组件,两者都应该依赖于抽象) 依赖倒置原则 1. 变量不可以持有具体类的引用 2. 不要让类派生自具体类 3. 不要覆盖基类中已实现的方法; 7. 最少知识原则:只用你的朋友谈话 8. 好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你。 9。单一职责:一个类应该只有一个引起变化的原因。 1.策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户; 2.观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动 更新。 3.装饰者模式动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 4.动态地将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。 5.工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个

算法之排序(中)-c语言实现

。_饼干妹妹 提交于 2020-02-06 01:20:36
文章来源:http://blog.seclibs.com/算法之排序中-c语言实现/ 上一篇文章里说了归并排序和快速排序,它们的代码实现是非常相似的,只要理解了其中的具体实现,还是比较容易写出代码的。 归并排序 代码如下,需要下载代码的请移步至文末 快速排序 代码如下,需要下载代码的请移步至文末 代码: 归并排序: GitHub 快速排序: GitHub 文章首发公众号和个人博客 公众号:无心的梦呓(wuxinmengyi) 博客:http://blog.seclibs.com/ 来源: CSDN 作者: Vesel『无心』 链接: https://blog.csdn.net/qq_18501087/article/details/104188074

路径追踪技术

。_饼干妹妹 提交于 2020-02-06 00:22:08
从本章开始,本书将正式进入全局光照技术的介绍。全局光照算法实际上是解决光照在场景中的传输问题, 在这些不同的全局光照技术中,我们将看到渲染方程被怎样以不同的形式,以及不同的近似方法来达成不同的光照传输解决方案;除了它们不同的渲染方程的形式(即算法)本身,我们还需要了解以什么样的参数或方式来度量不同算法之间的差异,例如处理不同复杂度场景的健壮性,实时性,精度等;此外,每种不同的算法几乎都是用不同的数学模型,这些新的算法会引入新的知识,以及新的特定于方法的技术细节;在本书后面的这些章节中,我们将逐步从以上这些层面上清晰地认识和理解这些算法。 我们会同时介绍离线和实时渲染技术。离线渲染技术通常是能够计算出光照比较真实的分布(例如保证光照传输过程中的能量守恒),产生高质量的图像,而实时渲染方法则包含了更多的近似处理,使之能够满足实时要求,我们将从离线到实时的方法来介绍这些技术。的那其实离线或实时并不是一个能够准确划分全局光照算法的一个标准,一些被认为是离线的渲染方法也可能在一定程度上(例如低复杂度的场景)达到实时渲染性能。所以更准确的标准应该是,按照算法对光照传输模拟的完整性来进行划分,离线的方法对光照传输的计算更全面,而实时方法可能会忽略或近似处理某些传输路径。 来源: CSDN 作者: wodownload2 链接: https://blog.csdn.net/wodownload2

算法的度量

天涯浪子 提交于 2020-02-06 00:13:57
O(n),也叫线性时间,这样的算法包括简单查找。 O(n * log n),这样的算法包括第4章将介绍的快速排序——一种速度较快的排序算法。 O(n^2),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。 O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法。 ​​​​ 来源: https://www.cnblogs.com/uncle7/p/12267270.html