七、基于比较的排序算法总结

1 问题

至此,总结一下已经研究过的排序算法:

insertion sort,Θ(n2)\Theta(n^2)Θ(n2)
merge sort, Θ(nlogn)\Theta(nlogn)Θ(nlogn)
quicksort, Θ(nlogn)\Theta(nlogn)Θ(nlogn)
heapsort,Θ(nlogn)\Theta(nlogn)Θ(nlogn)

  • 从上面这个现象发现,这些算法的算法复杂度≥Θ(nlogn)\ge\Theta(nlogn)Θ(nlogn);
  • 从算法的细节上看,算法的最基本的思想是比较元素大小

从上面的发现中,可以提出这样一个猜想:

所有基于比较的排序算法,算法复杂度≥Θ(nlogn)\ge\Theta(nlogn)Θ(nlogn)

2 证明结论

数学证明的思路分两步,1⃣️找到一种更加抽象的数学结构表达各种基于比较排序算法;2⃣️研究这种抽象的数学结构的性质;3⃣️利用得到的性质说明结论。

2.1 Decision-tree(抽象数学结构)

这个决策树和Machine Learning里的决策树本质上是一个意思。

  • 先看一个简单的例子
    在这里插入图片描述
  • 三个元素的Decision-tree很容易画出,但是≥4\ge44就不容易画出了,因为有Cn2C_n^2Cn2种比较,而每一次比较又有两种结果,这些比较的结果中一部分就可以决定全序…,已经超出人脑处理范畴,计算机也不太容易处理;
  • 仔细品品基于比较的排序算法,也是一顿比较之后确定一个全序,而这顿比较恰恰是Decision-tree所有比较之一,也就是Decision-tree的一条路径;
  • 不过我们不必过于纠结Decision-tree的细节结构,只需要知道它的存在性就足够解决我们今天的问题了,这就是数学抽象之美;

2.2 Decision-tree的数学性质

在这里插入图片描述

2.3 结论得证

决定基于比较的排序算法的复杂度是比较的次数,用decision tree就是某一个路径的高度hhh,现在已经证明整个二叉树的高度h≥Ω(nlogn)h\ge\Omega(nlogn)hΩ(nlogn),那就说明基于比较的排序算法的复杂度≥Ω(nlogn)\ge\Omega(nlogn)Ω(nlogn)

3 强调重点

  • 决定基于比较的排序算法的复杂度是比较的次数;
  • 在input确定的情况下,某种基于比较的排序算法的比较序列和decision tree的结构可以确定,该算法的比较序列只是decision tree的某一条路径;
  • 基于比较的排序算法随机化后仍符合上面的逻辑框架,结论仍然成立;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转账为demo,spring事务

spring 事务使用1. 业务代码2. xml配置3. 注解配置1. 业务代码 数据表结构 dao package com.lovely.dao.impl;import com.lovely.dao.AccountDao; import org.springframework.jdbc.core.JdbcTemplate;/*** author echo lovely* date 2020/8/9 11:01*/ public class AccountD…

影响你35岁前成功的好习惯与坏习惯

你想成功吗?那就及早培养有利于成功的好习惯。 习惯的力量是惊人的,35岁以前养成的习惯决定着你是否成功。 有这样一个寓言故事:一位没有继承人的富豪死后将自己的一大笔遗产赠送给远房的一位亲戚,这位亲戚是一个常年靠乞讨为生…

八、计数排序及其应用分析

1 本节思路 之前的算法的最基本的思想是比较元素大小,所以算法复杂度最好是Θ(nlogn)\Theta(nlogn)Θ(nlogn),本节不再基于元素比较,而是基于计数的Counting sort,然后应用在Radix sort上。 2 Counting sort 2.1 算法思想 Cou…

Google开发者模式调试css样式的方法

界面如下,你需要调试css样式… 看下图,高仿某云播放界面部分 需求 1.h5开发手机端界面,禁用缩放 2.如何精准的定位像上图一样,或者更好 3.使用Google调试器,调试css样式如何调样式 选择对应的样式 确定多个元素…

OD汇编需要标签

如何解决,看那红体字。。。 push 0046ad70 标签就是地址的引用 zai破解的道路上面面前行 技术参考:http://zhidao.baidu.com/link?url8JP8KFxTinclhl6MwpaZw5buhtv1p4zgpjy8rKkBPvD4YqCq2uudXQZrhuBLPGZm5ahe3d7YsLb3MeAFDXfsua转载于:https://www.cnbl…

git与github使用

1 从github上clone到本地 配置Git 首先在本地创建ssh key; $ ssh-keygen -t rsa -C "your_emailyouremail.com"后面的your_emailyouremail.com改为你在github上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车…

bootstrap panel 布局

panel1. 效果2. 基于bootstrap实现用于页面分专栏展示 1. 效果 成品 2. 基于bootstrap实现 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>panel 布局</title><link rel"stylesheet" href"cs…

GDB高级调试

一、多线程调试 多线程调试可能是问得最多的。其实&#xff0c;重要就是下面几个命令&#xff1a; info thread 查看当前进程的线程。thread <ID> 切换调试的线程为指定ID的线程。break file.c:100 thread all 在file.c文件第100行处为所有经过这里的线程设置断点。set …

pytorch之with torch.no_grad

在使用pytorch时&#xff0c;并不是所有的操作都需要进行计算图的生成&#xff08;计算过程的构建&#xff0c;以便梯度反向传播等操作&#xff09;。而对于tensor的计算操作&#xff0c;默认是要进行计算图的构建的&#xff0c;在这种情况下&#xff0c;可以使用 with torch.n…

mysql时间处理

两种方式&#xff0c;一个是在数据库查询的时候就截取&#xff0c;另一个就是在使用的时候截取。 1.数据库 select date_format(日期字段,’%Y-%m-%d’) as ‘日期’ from test 2.java程序 SimpleDateFormat dateFm new SimpleDateFormat("yyyy-MM-dd"); String da…

pytorch之object.grad.zero_()

object.grad.zero_()的意思是清0object的梯度值。 下面做个实验。 x torch.arange(4.0) x.requires_grad_(True) x.grad # 注意此时为None&#xff0c;不为0 y 2 * torch.dot(x, x) y.backward() x.grad # tensor([ 0., 4., 8., 12.]) x.grad.zero_() x.grad # tensor([0.…

PHP日期、时间戳相关的小程序

1、日期区间内的日期列表&#xff08;天&#xff09;&#xff1a; 1 public function dateExtent($begin,$end){ 2 $begin strtotime($begin); 3 $end strtotime($end); 4 while($begin<$end){ 5 $dateArr[] date…

spring jdbctemplate 实体列与数据表列 查询

目录1. BeanPropertyRowMapper接口2. 创建mapper类实现接口1. BeanPropertyRowMapper接口 当我查询时&#xff0c;使用下面的接口&#xff0c;原理是根据实体类的字段名和表的列名相同时才有结果&#xff0c;否则对应的字段是null List<MusicSong> songList jdbcTempl…

pytorch之trainer.zero_grad()

在下面的代码中&#xff0c;在每次l.backward()前都要trainer.zero_grad()&#xff0c;否则梯度会累加。 num_epochs 3 for epoch in range(num_epochs):for X, y in data_iter:l loss(net(X), y)trainer.zero_grad()l.backward()trainer.step()l loss(net(features), labe…