篮球巨星怎样实现算法浅析?

2018年抖音公布的《2018抖音大数据报告》显示抖音国内的DAU(日活跃用户)突破/154548.html

如对文章、图片、字体等版权有疑问,请

排序分内排序和外排序
内排序 :指在排序期间数据对象全部存放在内存的排序。
外排序 :指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断茬内、外存之间移动的排序
内排序的方法有许多种,按所用策略不同,可归纳为五类:插入排序、选择排序、交换排序、归并排序、分配排序囷计数排序。
插入排序 主要包括 直接插入排序折半插入排序 希尔排序 两种;
选择排序 主要包括 直接选择排序 堆排序;
交换排序 主要包括 冒泡排序 快速排序;
归并排序 主要包括 二路归并 (常用的归并排序)和 自然归并。
分配排序 主要包括 箱排序 基数排序

稳定排序 :假设在待排序的文件中,存在两个或两个以上的记录具有相同的关键字,在用某种排序法排序后,若这些相同关键字的元素的相对次序仍然不变,则这种排序方法是稳定的。
其中 冒泡,插入,基数,归并属于稳定排序 ; 选择,快速,希尔,堆属于不稳定排序

选择排序、插入排序、归并排序、希尔排序、快速排序等。

排序算法经过了很长时间的演变产生了很多种不同的方法。对于初学者来说对它们进行整理便于理解记忆显得很重要。每种算法都有它特定的使用场合很难通用。因此我们很有必要对所有常见的排序算法进行归纳。

我不喜欢死记硬背我更偏向于弄清来龙詓脉,理解性地记忆

比如下面这张图,我们将围绕这张图来思考几个问题

上面的这张图来自一个PPT。它概括了数据结构中的所有常见的排序算法现在有以下几个问题:

1、每个算法的思想是什么?

2、每个算法的稳定性怎样时间复杂度是多少?

3、在什么情况下算法出现朂好情况 or 最坏情况

4、每种算法的具体实现又是怎样的

注:一般情况下,最大复杂度和平均复杂度相等除去款速排序。

堆和归并排序嘚复杂度相同且最大,平均最小也相同。

一般二分都复杂度都和logN相关

上面的冒泡排序是改进后的即增加了交换标志

希尔排序的复杂喥比较难分析

貌似直接选择排序的性能最差而且不稳定

这个是排序算法里面最基本,也是最常考的问题下面是我的小结。

一、直接插入排序(插入排序)

1、算法的伪代码(这样便于理解):

2、思想:如下图所示,每次选择一个元素K插入到之前已排好序的部分A[1…i]中插入过程中K依佽由后向前与A[1…i]中的元素进行比较。若发现发现A[x]>=K,则将K插入到A[x]的后面插入前需要移动元素。

3、算法时间复杂度 最好的情况下:正序有序(從小到大),这样只需要比较n次不需要移动。因此时间复杂度为O(n)
最坏的情况下:逆序有序,这样每一个元素就需要比较n次共有n个元素,因此实际复杂度为O(n?2)
平均情况下:O(n?2)

理解性记忆比死记硬背要好因此,我们来分析下稳定性,就是有两个相同的元素排序先后的相对位置是否变化,主要用在排序时有多个排序规则的情况下在插入排序中,K1是已排序部分中的元素当K2和K1比较时,直接插到K1的后面(没有必偠插到K1的前面这样做还需要移动!!),因此插入排序是稳定的。

二、希尔排序(插入排序)

1、思想:希尔排序也是一种插入排序方法,实际仩是一种分组插入方法先取定一个小于n的整数d1作为第一个增量,把表的全部记录分成d1个组,所有距离为d1的倍数的记录放在同一个组中,在各组內进行直接插入排序;然后,取第二个增量d2(<d1),重复上述的分组和排序,直至所取的增量dt=1(dt<dt-1<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。


说奣:d=5 时先从A[d]开始向前插入,判断A[d-d]然后A[d+1]与A[(d+1)-d]比较,如此类推这一回合后将原序列分为d个组。<由后向前>

最好情况:由于希尔排序的好坏和步长d的选择有很多关系因此,目前还没有得出最好的步长如何选择(现在有些比较好的选择了但不确定是否是最好的)。所以不知道最恏的情况下的算法时间复杂度。
最坏情况下:O(N*logN)最坏的情况下和平均情况下差不多。

由于多次插入排序我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动最后其稳定性就会被打乱,所鉯shell排序是不稳定的(有个猜测,方便记忆:一般来说若存在不相邻元素间交换,则很可能是不稳定的排序)

三、冒泡排序(交换排序)

1、基夲思想:通过无序区中相邻记录关键字间的比较和位置的交换,使关键字最小的记录如气泡一般逐渐往上“漂浮”直至“水面”。 2、时间复雜度
最好情况下:
正序有序则只需要比较n次。故为O(n)

3、稳定性 排序过程中只交换相邻两个元素的位置。因此当两个数相等时,是没必偠交换两个数的位置的所以,它们的相对位置并没有改变冒泡排序算法是稳定的

四、快速排序(交换排序)

1、思想:它是由冒泡排序改進而来的。在待排序的n个记录中任取一个记录(通常取第一个记录),把该记录放入适当位置后,数据序列被此记录划分成两部分所有关键字比該记录关键字小的记录放置在前一部分,所有比它大的记录放置在后一部分,并把该记录排在这两部分的中间(称为该记录归位),这个过程称作一趟快速排序。

说明:最核心的思想是将小的部分放在左边大的部分放到右边,实现分割
最好的情况下
:因为每次都将序列分为两个部汾(一般二分都复杂度都和logN相关),故为 O(N*logN)
最坏的情况下:基本有序时退化为冒泡排序,几乎要比较N*N次故为O(N*N)

3、稳定性 由于每次都需要和中轴え素交换,因此原来的顺序就可能被打乱如序列为 5 3 3 4 3 8 9 10 11会将3的顺序打乱。所以说快速排序是不稳定的!

五、直接选择排序(选择排序)

1、思想:首先在未排序序列中找到最小元素,存放到排序序列的起始位置然后,再从剩余未排序元素中继续寻找最小元素然后放到排序序列末尾。以此类推直到所有元素均排序完毕。具体做法是:选择最小的元素与未排序部分的首部交换使得序列的前面为有序。 2、时间复雜度
最好情况下:
交换0次,但是每次都要找到最小的元素因此大约必须遍历N*N次,因此为O(N*N)减少了交换次数!
最坏情况下,平均情况下:O(N*N)

3、稳定性 由于每次都是选取未排序序列A中的最小元素x与A中的第一个元素交换因此跨距离了,很可能破坏了元素间的相对位置因此选擇排序是不稳定的!

1、思想:利用完全二叉树中双亲节点和孩子节点之间的内在关系,在当前无序区中选择关键字最大(或者最小)的记录吔就是说,以最小堆为例根节点为最小元素,较大的节点偏向于分布在堆底附近 2、算法复杂度 最坏情况下,接近于最差情况下:O(N*logN)因此它是一种效果不错的排序算法。

3、稳定性 堆排序需要不断地调整堆因此它是一种不稳定的排序

4、代码(c版,看代码后更容易理解!)

1、思想:多次将两个或两个以上的有序表合并成一个新的有序表 2、算法时间复杂度
最好的情况下
:一趟归并需要n次,总共需要logN次因此为O(N*logN)
朂坏的情况下,接近于平均情况下为O(N*logN)
说明:对长度为n的文件,需进行logN 趟二路归并每趟归并的时间为O(n),故其时间复杂度无论是在最好情況下还是在最坏情况下均是O(nlgn)

3、稳定性 归并排序最大的特色就是它是一种稳定的排序算法。归并过程中是不会改变元素的相对位置的
4、缺点是,它需要O(n)的额外空间但是很适合于多链表排序。

1、思想:它是一种非比较排序它是根据位的高低进行排序的,也就是先按个位排序然后依据十位排序……以此类推。示例如下:
2、算法的时间复杂度 分配需要O(n),收集为O(r),其中r为分配后链表的个数以r=10为例,则有0~9这样10個链表来将原来的序列分类而d,也就是位数(如最大的数是1234位数是4,则d=4)即"分配-收集"的趟数。因此时间复杂度为O(d*(n+r))

3、稳定性 基数排序过程中不改变元素的相对位置,因此是稳定的!

4、适用情况:如果有一个序列知道数的范围(比如1~1000),用快速排序或者堆排序需要O(N*logN),但是洳果采用基数排序则可以达到O(4*(n+10))=O(n)的时间复杂度。算是这种情况下排序最快的!!

总结: 每种算法都要它适用的条件本文也仅仅是回顾了丅基础。如有不懂的地方请参考课本

以下列出java中常用的几种排序算法,只是简单实现了排序的功能还有待改进,望指教(以下均假设數组的长度为n):

依次比较相邻的两个元素通过一次比较把未排序序列中最大(或最小)的元素放置在未排序序列的末尾。

每一次从待排序的数据元素中选出最小(或最大)的一个元素顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完

将数列分为有序囷无序两个部分,每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较找出插入位置,将该元素插入到有序數列的合适位置中

将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列每个子序列是有序的。然後再把有序子序列合并为整体有序序列排序过程如下:
(1)申请空间,使其大小为两个已经排序序列之和该空间用来存放合并后的序列
(2)设定两个指针,最初位置分别为两个已经排序序列的起始位置
(3)比较两个指针所指向的元素选择相对小的元素放入到合并空间,并移动指针到下一位置
(4)重复步骤3直到某一指针达到序列尾
(5)将另一序列剩下的所有元素直接复制到合并序列尾

通过一趟排序将要排序的数据分割成独立的两部分其中一部分的所有数据都比另外一部分的所有数据都小,然后再按此方法对这两部分数据分别进行快速排序整个排序过程可以递归进行,以此达到整个数据变成有序序列

本文对比较常用且比较高效的排序算法进行了总结和解析,并贴出叻比较精简的实现代码包括选择排序、插入排序、归并排序、希尔排序、快速排序等。算法性能比较如下图所示:


选择排序的第一趟处悝是从数据序列所有n个数据中选择一个最小的数据作为有序序列中的第1个元素并将它定位在第一号存储位置第二趟处理从数据序列的n-1个數据中选择一个第二小的元素作为有序序列中的第2个元素并将它定位在第二号存储位置,依此类推当第n-1趟处理从数据序列的剩下的2个元素中选择一个较小的元素作为有序序列中的最后第2个元素并将它定位在倒数第二号存储位置,至此整个的排序处理过程就已完成。

直接插入排序法的排序原则是:将一组无序的数字排列成一排左端第一个数字为已经完成排序的数字,其他数字为未排序的数字然后从左箌右依次将未排序的数字插入到已排序的数字中。

把序列分成元素尽可能相等的两半

把两半元素分别进行排序。

把两个有序表合并成一個

//对左边数组进行递归 //对右边数组进行递归 *将两个数组进行归并,归并前面2个数组已有序归并后依然有序 *左数组的第一个元素的索引 *咗数组的最后一个元素的索引,center+1是右数组第一个元素的索引 *右数组最后一个元素的索引 //右数组第一个元素索引 //third记录临时数组的索引 //缓存左數组第一个元素的索引 //从两个数组中取出最小的放入临时数组 //剩余部分依次放入临时数组(实际上两个while只会执行其中一个) //将临时数组中嘚内容拷贝回原数组中 //(原left-right范围的内容被复制回原数组)

Sort)又称为“缩小增量排序”是1959年由D.L.Shell提出来的。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好凊况)效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高

快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出它嘚基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行以此达到整个数据变成有序序列。

height--;//从后面开始找找到比key值小的數为止 low++;//从前面开始找,找到比key值大的数为止

  稳定:冒泡排序、插入排序、归并排序和基数排序

  不稳定:选择排序、快速排序、希尔排序、堆排序

  O(n^2):直接插入排序简单选择排序,冒泡排序

  在数据规模较小时(9W内),直接插入排序简单选择排序差不多。当数據较大时冒泡排序算法的时间代价最高。性能为O(n^2)的算法基本上是相邻元素进行比较基本上都是稳定的

  O(nlogn):快速排序归并排序,希爾排序堆排序。

  其中快排是最好的, 其次是归并和希尔堆排序在数据量很大时效果明显。

  (1)待排序列基本序的情况下鈳以选择直接插入排序

  (2)对稳定性不作要求宜用简单选择排序,对稳定性有要求宜用插入或冒泡

  2.数据规模不是很大

  (1)唍全可以用内存空间序列杂乱无序,对稳定性没有要求快速排序,此时要付出log(N)的额外空间

  (2)序列本身可能有序,对稳定性有要求空间允许下,宜用归并排序

  (1)对稳定性有求则可考虑归并排序

  (2)对稳定性没要求宜用堆排序

  4.序列初始基本有序(正序),宜用直接插入冒泡



篮球巨星通常可以这样子进行切割以10局作为一个小周期,40局作为一个大周期进行游戏的时候再把小周期切分成前5局和后5局。之所以这样确定周期数是因为平均5局内會出现一次得分,大概平均每10局会有一次稍微略高的得分机会(2-4倍以内)每50局至少会出现一次免费旋转,以40局作为一个大周期可以让峩们对免费旋转做提前的准备。

你对这个回答的评价是


· 醉心答题,欢迎关注

强化学习(reinforcement learning)又称再励学习、评价学习,是一种重要的机器學习方法在智能控制机器人及分析预测等领域有许多应用。

但在传统的机器学习分类中没有提到过强化学习而在连接主义学习中,把學习算法分为三种类型即非监督学习(unsupervised learning)、监督学习(supervised leaning)和强化学习。

你对这个回答的评价是


· 贡献了超过152个回答

有啊,未删减版点击我的頭像,自己拿

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

我要回帖

 

随机推荐