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

1 本节思路

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

2 Counting sort

2.1 算法思想

Counting sort算法的思想比较简单,就是通过统计每个数字的的个数确定每个数字的位置,譬如【8,6,2】这三个数,通过计数统计知道#8=1,#6=1,#2=1,很自然就是2排正位置1上,6排在位置1+1=2上,8排在位置2+1=3上,因为每个数字都是不重复,所以看起来很low,考虑到有充分数字的情况,就会领会到这个算法的巧妙之处了。

2.2 算法演示

在这里插入图片描述

2.3 算法描述

在这里插入图片描述

2.4 算法实现

# -*- coding: utf-8 -*-
import collectionsdef counting_sort(A, B, k):# let C[0..k] be a new arrayC = [0] * (k + 1)for i in range(k + 1):C[i] = 0for j in range(1, len(A)):C[A[j]] = C[A[j]] + 1# C[i] now contains the number of elements equal to i.for i in range(1, k + 1):C[i] = C[i] + C[i - 1]# C[i] now contains the number of elements less than or equal to i.for j in range(len(A) - 1, 0, -1):B[C[A[j]]] = A[j]C[A[j]] = C[A[j]] - 1if __name__ == '__main__':A = ['x', 2, 5, 3, 0, 2, 3, 0, 3]B = [0] * len(A)k = max(A[1:])print('before sort:', A[1:])counting_sort(A, B, k)print('after sort:', B[1:])

运行结果:

before sort: [2, 5, 3, 0, 2, 3, 0, 3]
after sort: [0, 0, 2, 2, 3, 3, 3, 5]

2.5 算法分析

容易得到Counting sort的算法复杂度是O(k+n)O(k+n)O(k+n),k为集合中元素个数,n为排序序列中元素个数,因为k<nk<nk<n,所以可以认为这个算法是线性时间复杂度,其原因就是空间换时间,所以 其用途在于小范围内的数据,如果数据范围过大(排序的元素个数不一定很多)会占用大量的内存,下面Radix sort正好可以应用到这一点。

3 Radix sort

3.1 Radix sort算法思想

Radix sort按位从后至前排序,因为要防止重复数字问题,所以顺序是从后至前。下面的演示很简单的表达了这种思想:
在这里插入图片描述

3.2 算法描述

在这里插入图片描述
这里stable sort 指的是counting sort。

3.3 算法分析

在这里插入图片描述

  • 考虑一个极端的情况,在一个b=32位的计算机上,每一个数字都可以表示为b个bit的序列,此时b=log2nb=log_2{n}b=log2n,应用上面的lemma8.3容易得到,在这种情况下使用RADIX-SORT的算法复杂度是Θ(b(n+2))=Θ(logn(n+2))\Theta(b(n+2))=\Theta(logn(n+2))Θ(b(n+2))=Θ(logn(n+2)),之前的基于“元素比较”排序算法没有什么提高。
  • 考虑另一个方向的极端情况,假如计算机内存超级大随便用(不考虑缓存消耗),那么上面问题的复杂度是Θ(n+32)\Theta(n+32)Θ(n+32),理论上完美,实际上不可信。
  • 两个极端的情况之间存在着一种权衡,这种权衡关系如下面lemma8.4所示,这个lemma8.4中使用适当的颗粒度r作为一位进行counting sort。

在这里插入图片描述

  • 有点问题。。。待续。。。

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

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

相关文章

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

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

OD汇编需要标签

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

git与github使用

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

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…

35款让你爱不释手的网页元素PSD素材

网页元素是构成一个网页的基本元素&#xff0c;包括按钮、表单、文本框、进度条等。这里收集了30款让你爱不释手的网页元素PSD素材。 1、国外个性网页模板UI设计PSD素材 下载地址>>> 2、带分享按钮的网页导航栏UI设计PSD素材 下载地址>>> 3、两款简洁的搜索框…

Accumulator

class Accumulator: #save"""在n个变量上累加。"""def __init__(self, n):self.data [0.0] * ndef add(self, *args):self.data [a float(b) for a, b in zip(self.data, args)]def reset(self):self.data [0.0] * len(self.data)def __get…

mogodb能干嘛

MongoDB 是什么 ? 能干嘛 &#xff1f; 1、MongoDB是什么&#xff1f; 2、为什么要用MongoDB&#xff1f; 3、主要特性 4、C/S服务模型 5、完善的命令行工具 6、几个shell实操 7、在Java中使用MongoDB 1、MongoDB是什么&#xff1f; MongoDB是一款为web应用程序和互联网基础设…

调用父类方法

1.用inherited;调用父类的构造函数&#xff1b;2.用inherited 函数名&#xff08;&#xff09; 调用父类同名非构造函数&#xff1b;转载于:https://www.cnblogs.com/spiritofcloud/p/3898360.html