算法
文章平均质量分 87
schdut
记录学习笔记,欢迎交流讨论。
展开
-
Python实现 《算法导论 第三版》中的算法 第23章 最小生成树
最小生成树对于一个带权重的连通无向图G=(V,E)G=(V,E)G=(V,E)和权重函数w:E→Rw:E \rightarrow Rw:E→R,该权重函数将每条边映射到实数值的权重上。最小生成树(Minimum Spanning Tree,MST)问题是指,找到一个无环子集T⊆ET\subseteq ET⊆E,能够将所有的结点连接起来,又具有最小的权重。解决最小生成树问题有两种算法:Kruskal算法和Prim算法。这两种算法都是贪心算法。贪心算法通常在每一步有多个可能的选择,并推荐选择在当前看来最好的原创 2021-01-20 11:07:13 · 325 阅读 · 0 评论 -
Python实现 《算法导论 第三版》中的算法 第22章 基本的图算法
文章目录图的表示图的遍历广度优先搜索深度优先搜索图的表示图有多种表示方法,比较常用的表示法有邻接链表和邻接矩阵。根据边的方向,图可以分为无向图和有向图;根据边的权重,图可以分为带权图和不带权图。对于图G=(V,E)G=(V,E)G=(V,E),其邻接链表表示由一个包含∣V∣|V|∣V∣条链表的数组AdjAdjAdj所构成,每个结点有一条链表。对于每个结点u∈Vu \in Vu∈V,邻接链表Adj[u]Adj[u]Adj[u]包含所有与结点uuu之间有边相连的结点vvv,即Adj[u]Adj[u]Ad原创 2021-01-13 15:55:45 · 369 阅读 · 1 评论 -
Python实现 《算法导论 第三版》中的算法 第2章 算法基础
目录第2章 算法基础1. 插入排序2. 归并排序3. 选择排序4. 冒泡排序第2章 算法基础1. 插入排序P17。插入排序比较简单。class InsertionSort: def sort(self, A): for i in range(1, len(A)): temp = A[i] j = i - 1 ...原创 2018-09-22 09:36:22 · 413 阅读 · 0 评论 -
Python实现 《算法导论 第三版》中的算法 第4章 分治策略
目录第4章 分治策略1. 最大子数组问题2. 最大子数组问题的其他解法3. Strassen算法第4章 分治策略1. 最大子数组问题P40。认真读一下4.1节,有一定算法基础就可以看懂。这个问题的全称是最大连续子数组问题。那么,最大子数组究竟是什么呢?要想弄清楚最大(连续)子数组是什么,首先需要明白(连续)子数组。(连续)子数组是数组中连续的几个元素组成的数组。此时会有两种不同理解,子数...原创 2018-09-30 22:04:05 · 401 阅读 · 0 评论 -
Python实现 《算法导论 第三版》中的算法 第6章 堆排序
目录第6章 堆排序1. 堆2. 优先队列第6章 堆排序1. 堆堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个结点对应数组中的一个元素。除最底层外,该树是完全充满的,而且是从左向右填充。表示堆的数组包括两个属性:A.length(通常)给出数组元素的个数,A.heap-size表示有多少堆元素存储在该数组中。也就是说,虽然A[1…A.length]可能都存有数据,但只有A[...原创 2018-10-13 19:43:37 · 458 阅读 · 1 评论 -
Python实现 《算法导论 第三版》中的算法 第7章 快速排序
目录第7章 快速排序1. 快速排序第7章 快速排序1. 快速排序快速排序是一种最坏情况时间复杂度为Θ(n2)\Theta(n^2)Θ(n2)的排序算法。虽然最坏情况很差,但是快速排序通常是实际排序应用中最好的选择。因为他的平均性能非常好:期望时间复杂度为Θ(nlgn)\Theta(nlgn)Θ(nlgn),而且其中隐含的常数因子非常小。另外,它还是原址排序,空间复杂度为O(1)O(1)O(...原创 2018-10-20 22:03:53 · 475 阅读 · 0 评论 -
Python实现 《算法导论 第三版》中的算法 第9章 中位数和顺序统计量
目录第9章 中位数和顺序统计量9.1 最小值和最大值9.2 期望为线性时间的选择算法9.3 最坏情况为线性时间的选择算法第9章 中位数和顺序统计量在一个有nnn个元素组成的集合中,第iii个顺序统计量(order statistic)是该集合中第iii小的元素。例如,最小值是第1个顺序统计量(i=1i=1i=1),最大值是第nnn个统计量。中位数比较特殊,当nnn为奇数时,它是唯一的;当nnn...原创 2018-10-29 14:19:43 · 493 阅读 · 0 评论 -
Python实现 《算法导论 第三版》中的算法 第8章 线性时间排序
目录第8章 线性时间排序8.1 排序算法的下界8.2 计数排序8.3 基数排序8.4 桶排序第8章 线性时间排序8.1 排序算法的下界归并排序、堆排序和快速排序能在O(nlgn)O(nlgn)O(nlgn)时间内排序nnn个数。归并排序和堆排序在最坏情况下就能够达到该时间,快速排序在平均情况达到该时间(快速排序最坏情况下是O(n2)O(n^2)O(n2))。如果在排序中各元素的次序依赖于...原创 2018-10-27 20:42:33 · 327 阅读 · 0 评论 -
Python实现 《算法导论 第三版》中的算法 第10章 基本数据结构
文章目录第10章 基本数据结构10.1 栈和队列10.2 链表第10章 基本数据结构10.1 栈和队列栈和队列都是一种动态集合。栈实现后进先出(last-in, first-out, LIFO)的策略:最后进入的元素被最先删除。队列实现先进先出(first-in, first-out, FIFO)的策略:最先进入的元素被最先删除。下面实现了书中的栈,包括:P129:STACK-EMPT...原创 2018-11-23 19:47:43 · 814 阅读 · 0 评论 -
二分搜索的模板(二)
二分搜索是算法搜索一部分的重要内容。虽然变化多端,但仍有迹可循,有法可依。记录一下在网上遇到的模板~这个模版的核心是将二分搜索(binary search)问题转化成:在给定升序数组中,寻找第一个或者最后一个 target 元素出现的索引。有几点需要注意:初始化:start = 0,end = array.length - 1循环判断条件:start + 1 < end。 表示当...原创 2018-04-02 14:42:29 · 340 阅读 · 0 评论 -
二分搜索的模板(一)
二分搜索是算法搜索一部分的重要内容。虽然变化多端,但仍有迹可循,有法可依。记录一下在网上遇到的模板~这个模版的核心是将二分搜索(binary search)问题转化成:在给定升序数组中,寻找大于等于 target 值的最小索引或小于等于 target 值的最大索引。有几点需要注意:初始化:start = -1,end = array.length循环判断条件:start + 1 &lt...原创 2018-04-01 20:31:27 · 301 阅读 · 0 评论 -
算法——算法分析
本博客根据数据结构与问题求解Java语言描述(第3版)(Data Structure and Problem Solving Using Java Third Edition)整理而成。百度百科 豆瓣评分算法:算法是一个明确指定的指定集合,计算机将按照这个指令集解决某个问题。 算法分析:对某个问题给定一个算法且证明这个算法是正确的,下一步就是要确定该算法所需要的资源量。原创 2017-08-07 10:35:40 · 827 阅读 · 0 评论 -
算法——归并排序
踏踏实实学算法,从今天开始,从现在开始。归并排序的思想: 1.把数组递归分割成两部分 2.递归到最后,数组元素个数为1个(个数为1个则有序) 则返回开始合并 3.两个长度为1的有序数组合并为长度为2的有序数组,两个长度为2的有序数组合并为长度为4的有序数组,合并到最后,数组实现排序。原创 2017-08-06 19:05:18 · 250 阅读 · 0 评论 -
算法——字符串匹配之朴素匹配算法
字符串匹配问题(string match,也叫字符串搜索)是在实际工程中经常会碰到的问题,通常其输入是主字符串(待匹配目标文本Target Text,String)和子串(模式,Pattern)组成,输出为子串在原字符串中的首次出现的位置。通常精确的字符串搜索算法包括朴素匹配算法(也叫暴力搜索,Brute force),KMP, BM(Boyer Moore), Sunday, Rabin-Karp等。原创 2017-08-13 10:12:19 · 1793 阅读 · 0 评论 -
算法——字符串匹配之KMP——看不懂算我输
主字符串用S代替,长度为N;模式字符串用P代替,长度为M本文记录的是博主学习KMP的过程,其中参考资料均已在文中给出链接,博主花了两天的时间才弄懂KMP。如果大家按照给出的学习过程,相信一定会很快弄懂KMP。KMP1.KMP算法思想:整体算法步骤和朴素匹配(暴力搜索)类似,相同点是逐个字符进行比较,全部比较成功则返回主字符串S的搜索位置,不同点是在于匹配不成功时,KMP可以找到向后移动到最佳位置继续匹配。原创 2017-08-13 11:09:48 · 496 阅读 · 0 评论 -
算法——插入排序
踏踏实实学算法,从今天开始,从现在开始。 插入排序的思想:数组第一个元素有序(一个元素的子序列有序),将第二元素插入前面的有序序列中,插入后数组前两个元素有序,依次将第三个元素到第N个元素插入到前面有序的序列中,数组实现排序。 如何实现插入:把待插入的元素前面的元素依次与待插入的元素进行比较,如果大于则向后移,遇到小于的元素(没到数组的首元素)则停止。 Shell优化:Don原创 2017-08-06 17:49:40 · 185 阅读 · 0 评论 -
算法——字符串匹配之Rabin-Karp
Rabin-Karp字符串匹配算法和之前介绍的[朴素匹配算法](http://blog.csdn.net/shengchaohua163/article/details/77140542)类似,也是对每一个字符进行比较。不同的是Rabin-Karp采用了把字符进行预处理,通过某种函数计算其函数值(指纹),比较的是每个字符的函数值。原创 2017-08-13 18:56:52 · 1369 阅读 · 0 评论 -
算法——选择排序
踏踏实实学算法,从今天开始,从现在开始。选择排序的思想:从开始遍历选择最小的元素与第一个元素进行交换,则第一个数字为最小,再从剩下元素中选择最小的元素与第二个进行交换,直到最后一个元素,数组实现排序。(从结尾遍历选择最大的元素)原创 2017-08-06 18:15:06 · 200 阅读 · 0 评论 -
算法——冒泡排序
踏踏实实学算法,从今天开始,从现在开始。冒泡排序的思想:循环比较相邻的两个数组元素,前者大则交换,前者小则不变,第一次冒泡(外层循环执行一次)得到一个最大的值放置在最后一位,第N次(数组长度为N,实际上第N-1次循环后数组已经有序,第N次循环中内循环不满足)冒泡后得到有序数组。原创 2017-08-05 19:52:23 · 254 阅读 · 0 评论 -
算法——快速排序
踏踏实实学算法,从今天开始,从现在开始。 快速排序的思想:每次递归选择一个桩,取其值(int pivot = array[pivotIndex]),从数组末尾向前寻找第一个小于该值pivot的元素将其放到桩处(记录该位置为high),从数组开始向后寻找第一个大于该值pivot的元素将其放到high处,再反复从后面往前寻找小于pivot的元素和从前往后寻找大于pivot的元素,直到两者相遇位置.原创 2017-08-06 19:25:26 · 245 阅读 · 0 评论 -
第一章课后的几个编程题——数据结构与问题描述Java语言描述(第3版)
题目描述:素数除了1和它本身没有其他因子(1不是素数,最小素数是2) 问题1. 写一个程序判断正整数N是不是素数? 问题2. 如果N是一个非常大的整数,如何判断?题目描述:查找过半元素题目描述:埃拉托色尼筛选法求素数原创 2017-08-08 08:35:21 · 509 阅读 · 0 评论