python算法

【Python数据结构与算法笔记day30】6.5. 希尔排序

℡╲_俬逩灬. 提交于 2020-02-01 22:24:33
文章目录 6.5. 希尔排序 希尔排序 希尔排序过程 希尔排序的分析 时间复杂度 希尔排序演示 6.5. 希尔排序 希尔排序 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因DL.Shell于1959年提出而得名。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 希尔排序过程 希尔排序的基本思想是:将数组列在一个表中并对列分别进行插入排序,重复这过程,不过每次用更长的列(步长更长了,列数更少了)来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身还是使用数组进行排序。 例如,假设有这样一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果我们以步长为5开始进行排序,我们可以通过将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样(竖着的元素是步长组成): 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 然后我们对每列进行排序: 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45

【Python数据结构与算法笔记day31】6.6. 归并排序

房东的猫 提交于 2020-02-01 20:19:31
文章目录 6.6. 归并排序 归并排序 归并排序的分析 时间复杂度 6.6. 归并排序 归并排序 归并排序是采用分治法的一个非常典型的应用。归并排序的思想就是先递归分解数组,再合并数组。 将数组分解最小之后,然后合并两个有序数组,基本思路是比较两个数组的最前面的数,谁小就先取谁,取了后相应的指针就往后移一位。然后再比较,直至一个数组为空,最后把另一个数组的剩余部分复制过来即可。 归并排序的分析 def merge_sort ( alist ) : if len ( alist ) <= 1 : return alist # 二分分解 num = len ( alist ) / 2 left = merge_sort ( alist [ : num ] ) right = merge_sort ( alist [ num : ] ) # 合并 return merge ( left , right ) def merge ( left , right ) : '''合并操作,将两个有序数组left[]和right[]合并成一个大的有序数组''' #left与right的下标指针 l , r = 0 , 0 result = [ ] while l < len ( left ) and r < len ( right ) : if left [ l ] < right [ r ] :

【Python数据结构与算法笔记day33】6.8. 搜索

我怕爱的太早我们不能终老 提交于 2020-02-01 19:26:12
文章目录 6.8. 搜索 搜索 二分法查找 二分法查找实现 (非递归实现) (递归实现) 时间复杂度 6.8. 搜索 搜索 搜索是在一个项目集合中找到一个特定项目的算法过程。搜索通常的答案是真的或假的,因为该项目是否存在。 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找 二分法查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 二分法查找实现 (非递归实现) def binary_search ( alist , item ) : first = 0 last = len ( alist ) - 1 while first <= last : midpoint = ( first + last ) / 2 if alist [ midpoint ] == item : return True elif item < alist [

【Python数据结构与算法笔记day03】1.1. 第一次尝试

心不动则不痛 提交于 2020-02-01 17:37:00
文章目录 1.1. 第一次尝试 第一次尝试 1.1. 第一次尝试 第一次尝试 import time start_time = time . time ( ) # 注意是三重循环 for a in range ( 0 , 1001 ) : for b in range ( 0 , 1001 ) : for c in range ( 0 , 1001 ) : if a ** 2 + b ** 2 == c ** 2 and a + b + c == 1000 : print ( "a, b, c: %d, %d, %d" % ( a , b , c ) ) end_time = time . time ( ) print ( "elapsed: %f" % ( end_time - start_time ) ) print ( "complete!" ) 运行结果: a, b, c: 0, 500, 500 a, b, c: 200, 375, 425 a, b, c: 375, 200, 425 a, b, c: 500, 0, 500 elapsed: 214.583347 complete! 注意运行的时间:214.583347秒 来源: CSDN 作者: 汪雯琦 链接: https://blog.csdn.net/qq_35456045/article/details

【Python数据结构与算法笔记day04】1.2. 算法的提出+算法的概念+算法的五大特性

久未见 提交于 2020-02-01 17:01:57
文章目录 1.2. 算法的提出 算法的提出 算法的概念 算法的五大特性 1.2. 算法的提出 算法的提出 算法的概念 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。 算法是独立存在的一种解决问题的方法和思想。 对于算法而言,实现的语言并不重要,重要的是思想。 算法可以有不同的语言描述实现版本(如C描述、C++描述、Python描述等),我们现在是在用Python语言进行描述实现。 算法的五大特性 输入 : 算法具有0个或多个输入 输出 : 算法至少有1个或多个输出 有穷性 : 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成 确定性 :算法中的每一步都有确定的含义,不会出现二义性 可行性 :算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成 来源: CSDN 作者: 汪雯琦 链接: https://blog.csdn.net/qq_35456045/article/details/104134023

【Python数据结构与算法笔记day05】1.3. 第二次尝试

↘锁芯ラ 提交于 2020-02-01 16:41:42
文章目录 1.3. 第二次尝试 第二次尝试 1.3. 第二次尝试 第二次尝试 import time start_time = time . time ( ) # 注意是两重循环 for a in range ( 0 , 1001 ) : for b in range ( 0 , 1001 - a ) : c = 1000 - a - b if a ** 2 + b ** 2 == c ** 2 : print ( "a, b, c: %d, %d, %d" % ( a , b , c ) ) end_time = time . time ( ) print ( "elapsed: %f" % ( end_time - start_time ) ) print ( "complete!" ) 运行结果: a, b, c: 0, 500, 500 a, b, c: 200, 375, 425 a, b, c: 375, 200, 425 a, b, c: 500, 0, 500 elapsed: 0.182897 complete! 注意运行的时间:0.182897秒 来源: CSDN 作者: 汪雯琦 链接: https://blog.csdn.net/qq_35456045/article/details/104134031

【Python数据结构与算法笔记day06】1.4. 算法效率衡量+执行时间反应算法效率+单靠时间值绝对可信吗?+时间复杂度与“大O记法”+如何理解“大O记法”+最坏时间复杂度+时间复杂度的几条基本计

百般思念 提交于 2020-02-01 16:08:04
文章目录 1.4. 算法效率衡量 算法效率衡量 执行时间反应算法效率 单靠时间值绝对可信吗? 时间复杂度与“大O记法” 如何理解“大O记法” 最坏时间复杂度 时间复杂度的几条基本计算规则 1.4. 算法效率衡量 算法效率衡量 执行时间反应算法效率 对于同一问题,我们给出了两种解决算法,在两种算法的实现中,我们对程序执行的时间进行了测算,发现两段程序执行的时间相差悬殊(214.583347秒相比于0.182897秒),由此我们可以得出结论: 实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。 单靠时间值绝对可信吗? 假设我们将第二次尝试的算法程序运行在一台配置古老性能低下的计算机中,情况会如何?很可能运行的时间并不会比在我们的电脑中运行算法一的214.583347秒快多少。 单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的! 程序的运行离不开计算机环境(包括硬件和操作系统),这些客观原因会影响程序运行的速度并反应在程序的执行时间上。那么如何才能客观的评判一个算法的优劣呢? 时间复杂度与“大O记法” 我们假定计算机执行算法每一个基本操作的时间是固定的一个时间单位,那么有多少个基本操作就代表会花费多少时间单位。算然对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的

python Apriori算法1

蹲街弑〆低调 提交于 2020-02-01 04:23:18
#参考Link:https://www.jianshu.com/p/2ee0a247a8cc #创建一个数据集合 def loadDataSet ( ) : #return [[1,3,4],[2,3,5],[1,2,3,5],[2,5]] return apriori_metadata # 创建一项集 # 所有元素转换为不可变的字典,放到列表中 def createC1 ( dataSet ) : c1 = [ ] for trans in dataSet : for item in trans : if not [ item ] in c1 : c1 . append ( [ item ] ) c1 . sort ( ) # [1,2,3,4,5] return list ( map ( frozenset , c1 ) ) #[{1},{2},{3},{4},{5}] # 获取满足最小支持度的候选集与其支持度 # 过滤掉不符合支持度的集合 # 返回 频繁项集列表retList 所有元素的支持度字典 # D = [{1, 3, 4}, {2, 3, 5}, {1, 2, 3, 5}, {2, 5}] # Ck 是k项集 example:1-项集 [{1},{2},{3},{4},{5}] # minSupport最小支持度 def getSetAndSupport ( D ,

09-07 元类

爷,独闯天下 提交于 2020-02-01 02:02:24
文章目录 一 元类介绍 二 class关键字创建类的流程分析 四 自定义元类控制类StanfordTeacher的创建 五 自定义元类控制类StanfordTeacher的调用 五 再看属性查找 六 作业 一 元类介绍 什么是元类呢?一切源自于一句话:python中一切皆为对象。让我们先定义一个类,然后逐步分析 class StanfordTeacher ( object ) : school = 'Stanford' def __init__ ( self , name , age ) : self . name = name self . age = age def say ( self ) : print ( '%s says welcome to the Stanford to learn Python' % self . name ) 所有的对象都是实例化或者说调用类而得到的(调用类的过程称为类的实例化),比如对象t1是调用类StanfordTeacher得到的 t1 = StanfordTeacher ( 'lili' , 18 ) print ( type ( t1 ) ) #查看对象t1的类是<class '__main__.StanfordTeacher'> 如果一切皆为对象,那么类StanfordTeacher本质也是一个对象,既然所有的对象都是调用类得到的

Python版[leetcode]1. 两数之和

瘦欲@ 提交于 2020-02-01 00:57:50
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] 一开始我的想法是直接用2个for循环遍历nums,用当前数和当前数之后的所有数求和,如果和target相同就直接返回当前索引数组 class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i in range(len(nums)): for j in range(i+1,len(nums)): if nums[i]+ nums[j] == target: return [i,j] 但是这种算法时间复杂度是 O(n 2 ),耗时很长,所以后来我参考了使用字典的方法: class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: """ :type nums: List[int] :type target: int