python包含啥算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python包含啥算法相关的知识,希望对你有一定的参考价值。
Python基础算法有哪些?1.
冒泡排序:是一种简单直观的排序算法。重复地走访过要排序的数列,一次比较两个元素,如果顺序错误就交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该排序已经完成。
2.
插入排序:没有冒泡排序和选择排序那么粗暴,其原理最容易理解,插入排序是一种最简单直观的排序算法啊,它的工作原理是通过构建有序序列,对于未排序数据在已排序序列中从后向前排序,找到对应位置。
3.
希尔排序:也被叫做递减增量排序方法,是插入排序的改进版本。希尔排序是基于插入排序提出改进方法的排序算法,先将整个待排序的记录排序分割成为若干个子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全记录进行依次直接插入排序。
4. 归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法Divide and的一个非常典型的应用。
5. 快速排序:由东尼·霍尔所发展的一种排序算法。又是一种分而治之思想在排序算法上的典型应用,本质上快速排序应该算是冒泡排序基础上的递归分治法。
6.
堆排序:是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质,即子结点的键值或索引总是小于它的父结点。
7.
计算排序:其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中,作为一种线性时间复杂度的排序,计算排序要求输入的数据必须是具有确定范围的整数。 参考技术A 1、冒泡排序
冒泡排序也是一种简单直观的排序算法。重复地走访过要排序的数列,一次比较两个元素,如果顺序错误就交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
2、插入排序
插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但原理是最容易理解,插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据在已排序序列中从后向前扫描,找到相应位置并插入。插入排序和冒泡排序一样也有一种优化算法叫做拆半插入。
3、希尔排序
希尔排序也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
4、归并排序
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法Divide
and的一个非常典型的应用。作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:自上而下的递归;自下而上的迭代。
5、快速排序
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序n个项目要Ο(nlogn)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他算法更快,因为它的内部循环可以在大部分的架构上很有效率地被实现出来。
6、堆排序
堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。
7、计数排序
计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
8、桶排序
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:在额外空间充足的情况下,尽量增大桶的数量,使用的映射函数能够将输入的N个数据均匀的分配到K个桶中,同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。
9、基数排序
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串和特定格式的浮点数,所以基数排序也不是只能使用于整数。
Python 的字典映射使用啥哈希算法?
【中文标题】Python 的字典映射使用啥哈希算法?【英文标题】:What hash algorithm does Python's dictionary mapping use?Python 的字典映射使用什么哈希算法? 【发布时间】:2012-02-18 08:27:47 【问题描述】:我正在做一个命令行解析器,想知道 python dict 使用什么样的哈希算法?
按照我的设置方式,我有一个模式匹配算法,它将标记化的输入序列与字典键匹配。有些键相对较长(长度为 5 或 6 个 6-7 个字符串的元组)。我想知道是否存在长字典键显着降低键检索效率的点。
【问题讨论】:
看看this question。它有一个指向 this page 的链接,它描述了 python 如何散列一些不同的类型,它可能对你有帮助。 看看Objects/dictnotes.txt 许多现代散列代码已针对 PEP 456 进行了修改,此处记录:python.org/dev/peps/pep-0456。答案是:根据编译参数和字符串大小,可以使用多个哈希函数。 【参考方案1】:它使用的哈希取决于用作键的对象——每个类都可以定义自己的 __hash__() 方法,它为特定实例返回的值就是用于字典的值。
Python 本身为 str 和 tuple 类型提供了哈希实现。快速浏览一下源代码应该会发现它们的确切算法。
元组的哈希值基于其内容的哈希值。算法本质上是这样的(稍微简化了):
def hash(tuple):
mult = 1000003
x = 0x345678
for index, item in enumerate(tuple):
x = ((x ^ hash(item)) * mult) & (1<<32)
mult += (82520 + (len(tuple)-index)*2)
return x + 97531
对于字符串,解释器还遍历每个字符,将它们与这个(再次稍微简化的)算法相结合:
def hash(string):
x = string[0] << 7
for chr in string[1:]:
x = ((1000003 * x) ^ chr) & (1<<32)
return x
要担心的更大问题是避免哈希冲突。当字典试图找到存储新对象的位置时,冲突的哈希键将导致线性搜索(这现在被认为是一个安全问题,并且在即将推出的 python 版本中行为可能会发生变化)
【讨论】:
哦,好的。出于某种原因,我假设 python 只是对所有数据类型使用了通用的字节码哈希算法。就碰撞哈希键而言,我认为这不会成为问题,因为我将拥有的键数量(相对)很少——可能有数千个。请原谅我的无知,但是冲突的哈希和线性搜索如何成为安全问题? @Joel Cornett:这是一个安全问题,因为哈希表使用桶来存储密钥,具有相同哈希码的密钥将被哈希到同一个桶中,迫使哈希表进行线性搜索每次它搜索一个密钥时,如果密钥的数量很大,这可能会非常低效(甚至可能导致拒绝服务)。如果程序遇到具有不同键且散列到相同散列码的散列表,则可能导致拒绝服务攻击。 如果攻击者可以控制字典中使用的键,那么他们可能能够插入成百上千的冲突键,从而使插入操作非常缓慢。在某些情况下,这可能会导致机器无响应或数据库无法使用——Dos 攻击 是否有发起此类攻击的记录案例?对于除了最简单的系统之外的所有系统似乎都非常困难,如果没有白盒知识则更难。 我听说的第一个攻击场景是针对 Web 服务的——如果 POST 变量最终出现在一个以它们的名字为关键字的字典中,那么攻击者就可以完全控制这些键,并且可以减慢速度任意一个服务器,有足够的变量。不过,我不知道野外是否有这样的攻击。以上是关于python包含啥算法的主要内容,如果未能解决你的问题,请参考以下文章