查找算法

第一阶段总结

妖精的绣舞 提交于 2020-02-27 15:26:48
计算机基础知识与Python简介 一,计算机基础知识 cpu: 相当于人类的大脑,运算和处理问题 内存: 临时存储数据,断电就消失了 硬盘: 永久存储数据 操作系统: 管理计算机硬件与软件资源的计算机程序,控制每个硬件之间数据交互 二,Python简介 龟叔 优美、清晰、简单 主要应用领域: 云计算 WEB开发 科学技术、人工智能 系统运维 爬虫 金融量化分析 图形GUI 游戏 Python发展史 1989年,Guido开始写Python 1991年,第一个Python解释器诞生 2004年,最流行的WEB框架Django诞生 2008年,python2和python3版本共存 python2:C,Java,C#,源码不统一,功能重复,维护难度大 python3:源码统一,维护难度降低了 python是一个编程语言 分类:编译型、解释型,强类型、弱类型 编译型:只翻译一次 代表语言:C,C++ 优点:运行速度快 缺点:开发速度慢 解释型:一句一句的翻译,逐行翻译 优点:开发速度快 缺点:运行速度慢 代表语言:Python,JavaS,PHP Python的优缺点 优点: Python的定位是优雅、明确、简单,初学者容易入门,而且可以编写非常复杂的程序。 开发效率非常高,Python有非常强大的第三方库 高级语言,无需考虑如何管理你的程序使用的内存一类的底层细节 可移植性

单片机常用的14个C语言算法,看过的都成了大神!

a 夏天 提交于 2020-02-27 13:30:15
算法(Algorithm): 计算机解题的基本思想方法和步骤。 算法的描述: 是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。 本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在数组x[10]。 二、求两个整数的最大公约数、最小公倍数 分析: 求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数) (1) 对于已知两数m,n,使得m>n; (2) m除以n得余数r; (3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4); (4) m←n,n←r,再重复执行(2)。 例如: 求 m="14" ,n=6 的最大公约数. m

《算法》笔记 15

拜拜、爱过 提交于 2020-02-27 08:10:22
暴力子字符串查找算法 隐式回退 性能 显式回退 Knuth-Morris-Pratt算法 确定有限状态自动机 DFA的构造 性能 Boyer-Moore算法 跳跃表的构建 性能 Rabin-Karp指纹字符串算法 关键思想 Horner方法 性能 字符串的一种基本操作就是子字符串查找。比如在文本编辑器或是浏览器中查找某个单词时,就是在查找子字符串。子字符串的长度(可能为100或1000)相对于整个文本的长度(可能为100万甚至是10亿)来说一般是很短的,在如此多的字符中找到匹配的模式是一个很大的挑战,为此计算机科学家们发明了多种有趣、经典且高效的算法。 ### 暴力子字符串查找算法 要解决这个问题,首先想到的是暴力查找的方法,在文本中模式可能出现匹配的任何地方检查是否匹配。 #### 隐式回退 首先是隐式回退的实现方式,之所以叫隐式回退,在与显式回退的实现对比后就明白原因了。 public static int search(String pat, String txt) { int patL = pat.length(); int txtL = txt.length(); for (int i = 0; i <= txtL - patL; i++) { int j; for (j = 0; j < patL; j++) if (txt.charAt(i + j) != pat

C#实现平衡多路查找树(B树)

自古美人都是妖i 提交于 2020-02-26 23:22:03
原文: C#实现平衡多路查找树(B树) 写在前面:搞了SQL Server时间也不短了,对B树的概念也算是比较了解。去网上搜也搜不到用C#或java实现的B树,干脆自己写一个。实现B树的过程中也对很多细节有了更深的了解。 简介 B树是一种为辅助存储设计的一种数据结构,在1970年由R.Bayer和E.mccreight提出。在文件系统和数据库中为了减少IO操作大量被应用。遗憾的是,他们并没有说明为什么取名为B树,但按照B树的性质来说B通常被解释为Balance。在国内通常有说是B-树,其实并不存在B-树,只是由英文B-Tree直译成了B-树。 一个典型的 B树如图1所示。 图1.一个典型的B树 符合如下特征的树才可以称为B树: 根节点如果不是叶节点,则至少需要两颗子树 每个节点中有N个元素,和N+1个指针。每个节点中的元素不得小于最大节点容量的1/2 所有的叶子位于同一层级(这也是为什么叫平衡树) 父节点元素向左的指针必须小于节点元素,向右的指针必须大于节点元素,比如图1中Q的左指针必须小于Q,右指针必须大于Q 为什么要使用B树 在计算机系统中,存储设备一般分为两种,一种为主存(比如说CPU二级缓存,内存等),主存一般由硅制成,速度非常快,但每一个字节的成本往往高于辅助存储设备很多。还有一类是辅助存储(比如硬盘,磁盘等),这种设备通常容量会很大,成本也会低很多,但是存取速度非常的慢

算法之二分查找(上)

送分小仙女□ 提交于 2020-02-26 09:44:29
文章来源: http://blog.seclibs.com/算法之二分查找上/ 二分查找在平时的生活中也挺常用的,比如说以前玩的猜数游戏,每次都取中间数,然后得知是大了,还是小了,这个例子也就是二分查找。 比如下面的这个例子,要查找有没有数值19,其中low和high是查找的区间的下标,mid是查找区域的中间值的下标。 二分查找的思想是比较容易理解的,而且它的时间复杂度也是比较低的。假设数据大小为n,每次查找完后都会缩小一半,即为除以2,最坏的情况也就是一直到查找空间为空的时候,所以它们的变化为n,n/2,n/4,n/8,…,n/2k,当n/2k=1时,k即为缩小的次数,因为每次都只涉及到两个数的大小比较,所以k次操作的时间复杂度为O(k),又因为n/2k=1,所以k=log2n,时间复杂度也就是O(logn),这是一个非常恐怖的数量级了,比如n为2的32次方,大约是四十多亿,用二分查找来查找里面的一个数的话,最多比较32次也就可以得到这个值了,这是一个非常恐怖的情况。 上面的原理已经很明确了,所以二分查找的实现并不是很复杂,但是有一个前提条件,有序数组中不存在重复元素,只有在这个情况下,二分查找的实现才是相对简单的,具体的实现在下一篇文章里提及。 虽然二分查找时间复杂度低,查找起来非常高效,但它也有一定的适用条件的。 首先,二分查找是依赖于数组的,如果使用其他的数据结构来实现的话

【从0到1学算法】大O表示法

偶尔善良 提交于 2020-02-26 03:36:50
一般我们在选择算法时,都是想要选择效率最高的算法。那算法的效率,用什么表示?没错!就是用大O表示法。 PS : 大O表示法中,log即为log2,后面不再说明。 下面以简单查找和二分查找,在含有n个元素的有序列表中查找其中一个元素为例,下表总结了我们发现的情况。 使用简单查找时,最多需要猜测次数与列表长度相同,这被称为线性时间,大O表示法为O(n)。 二分查找则不同,最多需要猜测次数为logn(n为列表长度),这被称为对数时间(log时间),大O表示法为O(logn)。 基本概念 大O表示法指出了算法的速度有多快。 可能你会好奇,它的单位是多少?秒?没有单位,它并非指的是时间,而是从增量的角度衡量。 列表中查找元素,简单查找、二分查找的增速如下图。 假若我们不知道增速,只知道查找100个元素时的查找时间,猜测10000个元素时的查找时间: 对于简单查找,100个元素时为100毫秒,简单推算出10000个元素为10秒; 对于二分查找,100个元素时为7毫秒,简单推算出10000个元素为700毫秒。 PS:简单推算 10000个元素时的运行时间= 运行时间(100个元素时)* 100 简单查找的推算是对的,因为的增速是n,而二分查找的推算是错的,它的增速为logn,这便不能理所当然简单推算了。 很显然,我们只要知道算法的增速,便能知道它在n个元素中运行的运行时间了

从原理到优化,深入浅出数据库索引

爷,独闯天下 提交于 2020-02-26 02:08:32
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 数据库查询是数据库的最主要功能之一,我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化,这篇文章对索引做一个系统的梳理,希望对大家有帮助。 一、MySQL有哪些索引类型 索引的分类可以从多个角度进行,下面分别从数据结构,物理存储和业务逻辑三个维度进行划分。 1、从数据结构角度 (1)B+树索引(O(log(n))) 关于B+树索引,后面会深入解析 (2)hash索引 仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引 只有Memory存储引擎显示支持hash索引 (3)FULLTEXT索引 现在MyISAM和InnoDB引擎都支持了 (4)R-Tree索引 用于对GIS数据类型创建SPATIAL索引 2、从物理存储角度 (1)聚集索引(clustered index) 正文内容按照一个特定维度排序存储,这个特定的维度就是聚集索引; Innodb存储引擎中行记录就是按照聚集索引维度顺序存储的,Innodb的表也称为索引表;因为行记录只能按照一个维度进行排序

二叉查找树与平衡二叉树

£可爱£侵袭症+ 提交于 2020-02-26 01:28:19
最近在看一些底层东西,涉及到一些树型结构的数据算法,找到一篇非常不错的文章,先膜拜然后在copy过来。 其中可能涉及一些概念,比如:中序遍历,高度什么的,在发个链接参考: https://www.jianshu.com/p/d1133ef8bc0e 二叉查找树   二叉查找树,也称二叉搜索树,或二叉排序树。其定义也比较简单,要么是一颗空树,要么就是具有如下性质的二叉树: (1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3) 任意节点的左、右子树也分别为二叉查找树; (4) 没有键值相等的节点。   如上图所示,是不同形态的二叉查找树。二叉查找树是对要查找的数据进行生成树,左支的值小于右支的值。在查找的时候也是一样的思路,从根节点开始,比节点大进入右支,比节点小进入左支,直到查找到目标值。   二叉查找树的插入算法比较简单:空树,就首先生成根节点;不是空树就按照查找的算法,找到父节点,然后作为叶子节点插入,如果值已经存在就插入失败。   删除操作稍微复杂一点,有如下几种情况: ​ (1)如果删除的是叶节点,可以直接删除; ​ (2)如果被删除的元素有一个子节点,可以将子节点直接移到被删除元素的位置; ​ (3)如果有两个子节点,这时候就采用中序遍历,找到待删除的节点的后继节点

iOS 底层探索 - cache_t

 ̄綄美尐妖づ 提交于 2020-02-25 19:17:48
上一篇我们一起探索了 iOS 类的底层原理,其中比较重要的四个属性我们都简单的过了一遍,我们接下来要重点探索第三个属性 cache_t ,对于这个属性,我们可以学习到苹果对于缓存的设计与理解,同时也会接触到消息发送相关的知识。 一、探索 cache_t 1.1 cache_t 基本结构 我们还是先过一遍 OC 中类的结构: struct objc_class : objc_object { // Class ISA; Class superclass ; cache_t cache ; // formerly cache pointer and vtable class_data_bits_t bits ; // class_rw_t * plus custom rr/alloc flags class_rw_t * data ( ) { return bits . data ( ) ; } . . . 省略代码 . . . } 接着我们查看源码中 cache_t 的定义: struct cache_t { struct bucket_t * _buckets ; mask_t _mask ; mask_t _occupied ; . . . 省略代码 . . . } 然后我们发现 cache_t 结构体的第一个成员 _buckets 也是一个结构体类型 bucket_t

查找最小的k个元素

萝らか妹 提交于 2020-02-25 07:59:29
算法中使用到了堆,即stl中的multiset。 #include <iostream> #include <vector> #include <set> using namespace std; typedef multiset<int, greater<int>> IntHeap; void FindKLeastNumbers( const vector<int>& data, IntHeap& leastNumbers, unsigned int k) { leastNumbers.clear(); if (k==0||data.size()<k) { return; } vector<int>::const_iterator iter=data.begin(); for (; iter!=data.end(); ++iter) { if (leastNumbers.size()<k) { leastNumbers.insert(*iter); } else { IntHeap::iterator iterFirst=leastNumbers.begin(); if (*iter<*iterFirst) { leastNumbers.erase(iterFirst); leastNumbers.insert(*iter); } } } } int main() {