第7章 排序

前言

        在这一章,我们讨论数组元素的排序问题。为简单起见,假设在我们的例子中数组只包含整数,虽然更复杂的结构显然也是可能的。对于本章的大部分内容,我们还假设整个排序工作能够在主存中完成,因此,元素的个数相对来说比较小(小于\mathit{10^{6}})。当然,不能在主存中完成而必须在磁盘或磁带上完成的排序也相当重要。这种类型的排序叫作外部排序(external sorting),将在本章末尾讨论外部排序。

        我们对内部排序的考察将指出:

  • 存在几种容易的算法以\mathit{O(N^{2})}排序,如插入排序。
  • 有一种算法叫作希尔排序(Shellsort),它的编程非常简单,以\mathit{o(N^{2})}运行,并在实践中很有效。
  • 有一些稍微复杂的\mathit{O(NlogN)}的排序算法。
  • 任何通用的排序算法均需要\mathit{\Omega (NlogN)}次比较。

        本章的其余部分将描述和分析各种排序算法。这些算法包含一些有趣的、重要的代码优化和算法设计思想。可以对排序做出精确的分析。预先说明,在适当的时候,我们将尽可能地多做一些分析。

7.1 预备知识

        我们描述的算法都将是可以互换的。每个算法都将接收一个含有元素的数组和一个包
含元素个数的整数。

        我们将假设\mathit{N}是传递到排序例程中的元素个数,它已经被检查过,是合法的。按照C
的约定,对于所有的排序,数据都将在位置0处开始。

        我们还假设“<”和“>”运算符存在,它们可以用于对输入进行一致的排序。除赋
值运算符外,这两种运算是仅有的允许对输入数据进行的操作。在这些条件下的排序叫作
基于比较的排序(comparison-based sorting)。

7.2 插入排序

7.2.1 算法

        最简单的排序算法之一是插入排序(insertion sort)。插入排序由\mathit{N-1}趟(pass)排序组成。对于\mathit{P=1}趟到\mathit{P=N-1}趟,插入排序保证从位置0到位置\mathit{P}上的元素为已排序状态。插入排序利用了这样的事实:位置0到位置\mathit{P-1}上的元素是已排过序的。图7-1显示一个简单的数组在每一趟插入排序后的情况。

        图7-1表达了一般的方法。在第\mathit{P}趟,我们将位置\mathit{P}上的元素向左移动到它在前\mathit{P+1}个元素中的正确位置上。图7-2中的程序实现该想法。第2~5行实现数据移动而没有明显使用交换。将位置\mathit{P}上的元素存于Tmp中,而(在位置\mathit{P}之前)所有更大的元素都向右移动一个位置。然后将Tmp置于正确的位置上。这种方法与实现二叉堆时所用到的技巧相同。

void InsertionSort(ElementType A[], int N)
{
    int j, P;
    
    ElementType Tmp;
    for (P = 1; P < N; P++)
    {
        Tmp = A[P];
        for (j = P; j > 0 && A[j - 1] > Tmp; j--)
            A[j] = A[j - 1];
        A[j] = Tmp;
    }
}

7.2.2 插入排序的分析

        由于嵌套循环每趟花费N次迭代,因此插入排序为\mathit{O(N^{2})},而且这个界是精确的,因为以反序输入可以达到该界。精确计算指出对于\mathit{P}的每一个值,第4行的测试最多执行\mathit{P+1}次。对所有的\mathit{P}求和,得到总数为

\sum_{i=2}^{N}i=2+3+4+\cdot \cdot \cdot +N=\Theta (N^{2})

        另一方面,如果输入数据已预先排序,那么运行时间为\mathit{O(N)},因为内层for循环的检测总是立即判定不成立而终止。事实上,如果输入几乎已排序(该术语将在下一节更严格地定义),那么插入排序将运行得很快。由于这种变化差别很大,因此值得我们去分析该算法平均情形的行为。实际上,和各种其他排序算法一样,插入排序的平均情形也是\Theta (N^{2}),详见下节的分析。

7.3 一些简单排序算法的下界

        数字数组的一个逆序(inversion)是指数组中具有\mathit{i<j}\mathit{A[i]>A[j]}的序偶(\mathit{A[i],A[j]})。在上节的例子中,输入数据34,8,64,51,32,21有9个逆序,即(34,8),(34,32),(34,21),(64,51),(64,32),(64,21),(51,32),(51,21),(32,21)。这正好是需要由插入排序(非直接)执行的交换次数。情况总是这样,因为交换两个不按原序排列的相邻元素恰好消除一个逆序,而一个排过序的数组没有逆序。由于算法中还有\mathit{O(N)}项其他的工作,因此插入排序的运行时间是\mathit{O(I+N)},其中\mathit{I}为原始数组中的逆序数。于是,若逆序数是\mathit{O(N)},则插入排序以线性时间运行。

        我们可以通过计算排列中的平均逆序数而得出插入排序平均运行时间的精确的界。如往常一样,定义平均是一个困难的命题。我们将假设不存在重复元素(如果允许重复,那么我们甚至连重复的平均次数究竟是什么都不清楚)。利用该假设,我们可设输入数据是前\mathit{N}个整数的某个排列(因为只有相对顺序才是重要的),并设所有的排列都是等可能的。在这些假设下,我们有如下定理:

        定理 7.1 \mathit{N}个互异数的数组的平均逆序数是\mathit{N(N-1)/4}

        证明:对于含有任意的数的表\mathit{L},考虑其反序表\mathit{L_{r}}。上例中的反序表是21,32,51,64,8,34。考虑该表中任意两个数的序偶(x,y),且y>x。显然,恰是\mathit{L}\mathit{L_{r}}之中的一个,该序偶表示一个逆序。在表\mathit{L}和它的反序表\mathit{L_{r}},中序偶的总个数为\mathit{N(N-1)/2}。因此,平均表有该量的一半,即\mathit{N(N-1)/4}个逆序。

        这个定理意味着插入排序平均是二次的,同时也提供了只交换相邻元素的任何算法的一个很强的下界。

        定理 7.2 通过交换相邻元素进行排序的任何算法平均需要\mathit{\Omega (N^{2})}时间。

        证明:初始的平均逆序数 是\mathit{N(N-1)/4=\Omega (N^{2})},而每次交换只减少一个逆序,因此需要\mathit{\Omega (N^{2})}次交换。

        这是证明下界的一个例子,它不仅对非显式地实施相邻元素的交换的插入排序有效,而且对诸如冒泡排序和选择排序等其他一些简单算法也是有效的,不过这些算法将不在这里描述。事实上,它对一整类只进行相邻元素的交换的排序算法(包括那些未被发现的算法)都是有效的。正因为如此,这个证明在经验上是不能被认可的。虽然这个下界的证明非常简单,但是一般说来证明下界要比证明上界复杂得多。

        这个下界告诉我们,为了使一个排序算法以亚二次(subquadratic)或\mathit{o (N^{2})}时间运行,必须执行一些比较,特别要对相距较远的元素进行交换。一个排序算法通过删除逆序得以向前进行,而为了有效地运行,它必须每次交换删除不止一个逆序。

7.4 希尔排序

        希尔排序(Shellsort)的名称源于它的发明者Donald Shell,该算法是冲破二次时间屏障的第一批算法之一,不过,从它的发现之日起,又过了若干年后才证明了它的亚二次时间界。正如上节所提到的,它通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。由于这个原因,希尔排序有时也叫作缩小增量排序(diminishing increment sort)。

        希尔排序使用一个序列\mathit{h_{1},h_{2},\cdot \cdot \cdot ,h_{t}}叫作增量序列(increment sequence)。只要\mathit{h_{1}=1},任何增量序列都是可行的,不过,有些增量序列比另外一些增量序列更好(后面我们将讨论这个问题)。在使用增量\mathit{h_{k}}的一趟排序之后,对于每一个\mathit{i}我们有\mathit{A[i]\leqslant A[i+h_{k}]}(这里它是有意义的),所有相隔\mathit{h_{k}}的元素都被排序。此时称文件是\mathit{h_{k}}-排序的(\mathit{h_{k}}-sorted)。例如,图7-3显示了各趟排序后数组的情况。希尔排序的一个重要性质(我们只叙述而不证明)是一个\mathit{h_{k}}-排序的文件(此后将是\mathit{h_{k-1}}-排序的)保持它的\mathit{h_{k}}-排序性。事实上,假如情况不是这样的话,那么该算法也就没什么意义了,因为前面各趟排序的结果会被后面各趟排序给打乱。

        \mathit{h_{k}}-排序的一般做法是,对于\mathit{h_{k},h_{k}+1,\cdot \cdot \cdot ,N-1}中的每一个位置\mathit{i},把其上的元素放到\mathit{i,i-h_{k},i-2h_{k}\cdot \cdot \cdot }中间的正确位置上。虽然这并不影响最终结果,但是仔细的考察指出,一趟\mathit{h_{k}}-排序的作用就是对\mathit{h_{k}}个独立的子数组执行一次插入排序。当我们分析希尔排序的运行时间时,这个考察结果将是很重要的。

        增量序列的一种流行(但是不好)的选择是使用Shell建议的序列:\mathit{h_{t}=[N/2]}\mathit{h_{k}=[h_{k+1}/2]}图7-4包含一个使用该序列实现希尔排序的程序。后面我们将看到,存在一些递增的序列,它们对该算法的运行时间做出了重要的改进,即使是一个小的改变都可能剧烈地影响算法的性能。

void ShellSort(ElementType A[], int N)
{
    int i, j, Increment;
    ElementType Tmp;

    for (Increment = N / 2; Increment > 0; Increment /= 2)
        for(i = Increment; i < N; i++)
        {
            Tmp = A[i];
            for (j = i; j >= Increment; j -= Increment)
                if(Tmp < A[j - Increment])
                    A[j] = A[j - Increment];
                else
                    break;
            A[j] = Tmp;
        }
}

希尔排序的最坏情形分析

        虽然希尔排序编程简单,但是,其运行时间的分析则完全是另外一回事。希尔排序的运行时间依赖于增量序列的选择,而证明可能相当复杂。希尔排序的平均情形分析,除最平凡的一些增量序列外,是一个长期未解决的问题。我们将证明在两个特别的增量序列下最坏情形的精确的界。

        定理 7.3 使用希尔增量时希尔排序的最坏情形运行时间为\Theta (N^{2})

        证明:证明不仅需要指出最坏情形运行时间的上界,而且还需要指出存在某个输入实际上就花费\Omega (N^{2})时间运行。首先通过构造一个坏情形来证明下界。我们先选择\mathit{N}是2的幂。这使得除最后一个增量是1外所有的增量都是偶数。现在,我们给出一个数组Input-Data作为输入,它的偶数位置上有\mathit{N/2}个同为最大的数,而在奇数位置上有\mathit{N/2}个同为最小的数(对该证明,第一个位置是位置1)。由于除最后一个增量外所有的增量都是偶数,因此,当我们进行最后一趟排序前,\mathit{N/2}个最大的元素仍然处在偶数位置上,而\mathit{N/2}个最小的元素也还是在奇数位置上。于是,在最后一趟排序开始之前第\mathit{i}个最小的数(\mathit{i\leqslant N/2})在位置\mathit{2i-1}上。将第\mathit{i}个元素恢复到其正确位置需要在数组中移动\mathit{i-1}个间隔。这样,仅仅将\mathit{N/2}个最小的元素放到正确的位置上就至少需要\sum_{i=1}^{N/2}i-1=\Omega (N^{2})的工作。举一个例子,图7-5显示一个\mathit{N=16}时的坏(但不是最坏)的输入。在2-排序后的逆序数一直恰好保持为1+2+3+4+5+6+7=28,因此,最后一趟排序将花费相当多的时间。

        现在我们证明上界\mathit{O(N^{2})}以结束本证明。前面已经观察到,带有增量\mathit{h_{k}}的一趟排序由\mathit{h_{k}}个关于\mathit{N/h_{k}}个元素的插入排序组成。由于插入排序是二次的,因此一趟排序总的开销是\mathit{O(h_{k}(N/h_{k})^{2})=O(N^{2}/h_{k})}。对所有各趟排序求和则给出总的界为\mathit{O(\sum_{i=1}^{t}N^{2}/h_{i})=O(N^{2}\sum_{i=1}^{t}1/h_{k})}。因为这些增量形成一个几何级数,其公比为2,而该级数中的最大项是
\mathit{h_{1}=1},因此,\mathit{\sum_{i=1}^{t}1/h_{i}<2}。于是,我们得到总的界\mathit{O(N^{2})}

        希尔增量的问题在于,这些增量对未必互素,因此较小的增量可能影响很小。Hibbard提出一个稍微不同的增量序列,它在实践中(并且理论上)给出更好的结果。他的增量形如\mathit{1,3,7,\cdot \cdot \cdot ,2^{k}-1}。虽然这些增量几乎是相同的,但关键的区别是相邻的增量没有公因子。现在我们就来分析使用这个增量序列的希尔排序的最坏情形运行时间,这个证明相当复杂。

        定理 7.4 使用Hibbard增量的希尔排序的最坏情形运行时间为\mathit{\Theta (N^{3/2})}

        证明:我们只证明上界而将下界的证明留作练习。这个证明需要堆垒数论(additivenumber theory)中某些众所周知的结果。本章末提供了这些结果的参考资料。

        和前面一样,对于上界,我们还是计算每一趟排序的运行时间的界,然后对各趟求和。对于那些\mathit{h_{k}>N^{1/2}}的增量,我们将使用前一定理得到的界\mathit{O(N^{2}/h_{k})}。虽然这个界对于其他增量也是成立的,但是它太大,用不上。直观地看,我们必须利用这个增量序列是特殊的这样一个事实。我们需要证明的是,对于位置\mathit{P}上的任意元素\mathit{A_{p}},当要执行\mathit{h_{k}}-排序时,只有少数元素在位置\mathit{P}的左边且大于\mathit{A_{p}}

        当对输入数组进行\mathit{h_{k}}-排序时,我们知道它已经是\mathit{h_{k+1}}-排序和\mathit{h_{k+2}}-排序的了。在\mathit{h_{k}}-排序以前,考虑位置\mathit{P}\mathit{P-i}上的两个元素,其中\mathit{i\leqslant P}。如果\mathit{i}\mathit{h_{k+1}}\mathit{h_{k+2}}的倍数,那么显然\mathit{A[P-i]<A[P]}。不仅如此,如果\mathit{i}可以表示为\mathit{h_{k+1}}\mathit{h_{k+2}}的线性组合(以非负整数的形式),那么也有\mathit{A[P-i]<A[P]}。例如,当我们进行3-排序时,文件已经是7-排序和
15-排序的了。52可以表示为7和15的线性组合:52=1×7+3×15。因此,A[100]不可能大于A[152],因为\mathit{A[100]\leqslant A[107]\leqslant A[122]\leqslant A[137]\leqslant A[152]}

        现在,\mathit{h_{k+2}=2h_{k+1}+1},因此\mathit{h_{k+1}}\mathit{h_{k+2}}没有公因子。在这种情形下,可以证明,至少和\mathit{(h_{k+1}-1)(h_{k+2}-1)=8h_{k}^{2}+4h_{k}}一样大的所有整数都可以表示为\mathit{h_{k+1}}\mathit{h_{k+2}}的线性组合(见本章末尾的参考文献)。

        这就告诉我们,第4行的for循环体对于这些\mathit{N-h_{k}}位置上的每一个,最多执行\mathit{8h_{k}+4=O(h_{k})}次。于是我们得到每趟的界\mathit{O(Nh_{k})}

        利用大约一半的增量满足\mathit{h_{k}<\sqrt{N}}的事实并假设\mathit{t}是偶数,那么总的运行时间为
\mathit{O(\sum_{k+1}^{t/2}Nh_{k}+\sum_{k=t/2+1}^{t}N^{2}/h_{k})=O(N\sum_{k=1}^{t/2}h_{k}+N^{2}\sum_{k=t/2+1}^{t}1/h_{k})}
因为两个和都是几何级数,并且\mathit{h_{t/2}=\Theta (\sqrt{N})},所以上式简化为
\mathit{=O(Nh_{t/2})+O(\frac{N^{2}}{h_{t/2}})=O(N^{3/2})}

        使用Hibbard增量的希尔排序平均情形运行时间基于模拟的结果被认为是\mathit{O(N^{5/4})},但是没有人能够证明该结果。Pratt已经证明,\mathit{\Theta (N^{3/2})}的界适用于广泛的增量序列。

        Sedgewick 提出了几种增量序列,其最坏情形运行时间(也是可以达到的)为\mathit{O(N^{4/3})}。对于这些增量序列的平均运行时间猜测为\mathit{O(N^{7/6})}。经验研究指出,在实践中这些序列的运行要比Hibbard的好得多,其中最好的是序列(1,5,19,41,109,...),该序列中的项或者是\mathit{9\cdot 4^{i}-9\cdot 2^{i}+1},或者是\mathit{4^{i}-3\cdot 2^{i}+1}。通过将这些值放到一个数组中可以最容易地实现该算法。虽然有可能存在某个增量序列使得能够对希尔排序的运行时间做出重大改进,但是,这个增量在实践中还是最为人们称道的。

        关于希尔排序还有几个其他结果,它们需要数论和组合数学中一些艰深的定理而且主要是在理论上有用。希尔排序是算法非常简单又具有极其复杂的分析的一个好例子。

        希尔排序的性能在实践中是完全可以接受的,即使是对于数以万计的\mathit{N}仍是如此。编程的简单特点使得它成为对较大的输入数据经常选用的算法。

7.5 堆排序

7.6 归并排序

7.7 快速排序

7.7.1 选取枢纽元

7.7.2 分割策略

7.7.3 小数组

7.7.4 实际的快速排序例程

7.7.5 快速排序的分析

7.7.6 选择的线性期望时间算法

7.8 大型结构的排序

7.9 排序的一般下界

7.10 桶式排序

7.11 外部排序

7.11.1 为什么需要新的算法

7.11.2 外部排序模型

7.11.3 简单算法

7.11.4 多路合并

7.11.5 多相合并

7.11.6 替换选择

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/253539.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【TB作品】51单片机,语音出租车计价器

西交大题目 1.语音出租车计价器 一、功能要求: 1.具有可模拟出租车车轮转速传感器的硬件设计,可计量出租车所走的公 里数。 2.显示和语音播报里程、价格和等待红灯或堵车的计时价格: 3.具有等待计时功能 4.具有实时年月日显示和切换功能。 5.操作简单、界面友好。 二、设计建议…

机器学习算法---异常检测

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…

计算机网络:自顶向下第八版学习指南笔记和课后实验--运输层

记录一些学习计算机网络:自顶向下的学习笔记和心得 Github地址&#xff0c;欢迎star ⭐️⭐️⭐️⭐️⭐️ 运输层 TCP&#xff1a; 传输控制协议 报文段 UDP&#xff1a; 用户数据包协议 数据报 将主机间交付扩展到进程间交付被称为运输层的多路复用与多路分解 将运输层…

饥荒Mod 开发(十三):木牌传送

饥荒Mod 开发(十二)&#xff1a;一键制作 饥荒Mod 开发(十四)&#xff1a;制作屏幕弹窗 一键传送源码 饥荒的地图很大&#xff0c;跑地图太耗费时间和饥饿值&#xff0c;如果大部分时间都在跑图真的是很无聊&#xff0c;所以需要有一个能够传送的功能&#xff0c;不仅可以快速…

docker文档转译1

写在最前面 本文主要是转译docker官方文档。主题是Docker overview&#xff0c;这里是链接 Docker概述 Docker是一个用于开发、发布和运行应用程序的开放平台。Docker使你能够将应用程序与基础设施分离&#xff0c;从而可以快速交付软件。你可以使用相同的方法像管理应用程序…

HarmonyOS4.0从零开始的开发教程18HarmonyOS应用/元服务上架

HarmonyOS&#xff08;十六&#xff09;HarmonyOS应用/元服务上架 简介 随着生活节奏的加快&#xff0c;我们有时会忘记一些重要的事情或日子&#xff0c;所以提醒功能必不可少。应用可能需要在指定的时刻&#xff0c;向用户发送一些业务提醒通知。例如购物类应用&#xff0c…

急速上手搭建单节点 k8s集群实战

Minikube搭建 是一种轻量化的Kubernetes集群&#xff0c;是k8s社区为了帮助开发者和学习者能够更好学习和体验k8s功能而推出的&#xff0c;使用个人PC的虚拟化环境就快速构建启动单节点k8s机器准备&#xff1a;阿里云 CentOS 7.x &#xff0c;2核4g 安装 安装Docker # 1.先…

Eclipse 自动生成注解,如果是IDEA可以参考编译器自带模版进行修改

IDEA添加自动注解 左上角选择 File -> Settings -> Editor -> File and Code Templates&#xff1b; 1、添加class文件自动注解&#xff1a; ​/*** <b>Function: </b> todo* program: ${NAME}* Package: ${PACKAGE_NAME}* author: Jerry* date: ${YEA…

liunx之Samba服务器

环境&#xff1a;虚拟机CENTOS 7和 测试机相通 一、Samba服务器_光盘共享&#xff08;匿名访问&#xff09; 1.在虚拟机CENTOS 7安装smb服务&#xff0c;并在防火墙上允许samba流量通过 2. 挂载光盘 3.修改smb.conf配置文件&#xff0c;实现光盘匿名共享 4. 启动smb服务 5.在…

电子电器架构( E/E) 演化 —— 大算力

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

计算机网络(1):开始

计算机网络&#xff08;1&#xff09;&#xff1a;开始 计算机网络在信息时代中的作用 21世纪的一些重要特征就是数字化、网络化和信息化&#xff0c;是一个以网络为核心的信息时代。要实现信息化就必须依靠完善的网络&#xff0c;因为网络可以非常迅速地传递信息。因此网络现…

【UML】第5篇 UML中的视图和图

目录 一、视图和图 二、图的种类 2.1 结构图 2.2 行为图 图是UML中最重要的概念了&#xff0c;起码我是这么认为。 上篇关于低代码的文章&#xff0c;我也说了&#xff0c;未来也许AI编码&#xff0c;我们更重要的工作&#xff0c;是能够为业务进行建模&#xff0c;拆解&a…

WPF Icon矢量库 MahApps.Metro.IconPacks

文章目录 前言MahApps.Metro.IconPacksIconPacks.Browser简单使用简单使用案例代码Icon版本个人推荐 Icon自定义版权问题 前言 为了更快的进行开发&#xff0c;我找到了一个WPF的矢量图库。这样我们就不用去网上找别人的矢量库了 MahApps.Metro.IconPacks MahApps.Metro.Icon…

Elasticsearch的使用总结

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。 put/post请求&#xff1a;http://localhost:9200/索引库名称 {"settings":{"index":{"number_of_shards":1, # 分片数量…

数据仓库与数据挖掘小结

更加详细的只找得到pdf版本 填空10分 判断并改错10分 计算8分 综合20分 客观题 填空10分 判断并改错10分--错的要改 mooc中的--尤其考试题 名词解释12分 4个&#xff0c;每个3分 经常碰到的专业术语 简答题40分 5个&#xff0c;每道8分 综合 画roc曲线 …

neuq-acm预备队训练week 9 P3916 图的遍历

题目描述 给出 N 个点&#xff0c;M 条边的有向图&#xff0c;对于每个点 v&#xff0c;求 A(v) 表示从点 v 出发&#xff0c;能到达的编号最大的点。 题目限制 输入格式 第 1 行 2 个整数N,M&#xff0c;表示点数和边数。 接下来 M 行&#xff0c;每行 22 个整数 Ui​,Vi​…

[足式机器人]Part4 南科大高等机器人控制课 Ch08 Rigid Body Dynamics

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch08 Rigid Body Dynamics 1. Spatial Vecocity1.1 Spatial vs. Conventional Accel1.2 Plueker Coordinate System and…

STM32F103RCT6开发板M3单片机教程04--按键检测

原画图讲解 本教程使用是&#xff08;光明谷SUN_STM32mini开发板&#xff09; 首先了硬件连接原理&#xff0c;STM32F103RCT6开发板是mini最小系统板&#xff0c;板子在没并有按键。需要自行用面包板搭建。 硬件连接&#xff1a; PC10 -> KEY1 &#xff08;MCU内部上拉…

MATLAB图像处理技巧

MATLAB图片处理------动态绘图 1. 动态绘图2. XXXXX 1. 动态绘图 主要用到四个函数&#xff0c;分别为getframe、frame2im、rgb2ind以及imwrite&#xff1a; 1.getframe&#xff1a;获取当前绘图窗口的图片作为影片帧&#xff1b; 2.frame2im&#xff1a;从单个影片帧 F 返回索…

数据仓库与数据挖掘c5-c7基础知识

chapter5 分类 内容 分类的基本概念 分类 数据对象 元组(x,y) X 属性集合 Y 类标签 任务 基于有标签的数据&#xff0c;学习一个分类模型&#xff0c;通过这个分类模型&#xff0c;可以把一组属性x映射到一个特定的类别y上 类别y 提前设定好的--如&#xff1a;学生…