查找算法

二十二、mysql索引原理详解

自古美人都是妖i 提交于 2019-12-03 04:22:24
背景   使用mysql最多的就是查询,我们迫切的希望mysql能查询的更快一些,我们经常用到的查询有: 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录(between and) 对查询出来的结果排序   mysql的索引的目的是使上面的各种查询能够更快。 一、预备知识   什么是索引?   上一篇中有详细的介绍,可以过去看一下: 什么是索引?   索引的本质: 通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。   磁盘中数据的存取   以机械硬盘来说,先了解几个概念。   扇区 :磁盘存储的最小单位,扇区一般大小为512Byte。   磁盘块 :文件系统与磁盘交互的的最小单位(计算机系统读写磁盘的最小单位),一个磁盘块由连续几个(2^n)扇区组成,块一般大小一般为4KB。   磁盘读取数据 :磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为 寻道时间、旋转延迟、传输时间 三个部分,寻道时间指的是磁臂移动到指定磁道所需要的时间,主流磁盘一般在5ms以下;旋转延迟就是我们经常听说的磁盘转速,比如一个磁盘7200转,表示每分钟能转7200次,也就是说1秒钟能转120次,旋转延迟就是1/120/2 = 4.17ms

MySQL 查询优化器(三)

我的梦境 提交于 2019-12-03 04:01:51
2、复合查询 在进行复合查询时,为了体现外连接(left join、right join)和一般联合查询的区别,对student表增加了几条记录,而这几条记录在std_cur和course中都没有对应的记录。 2.1 多表联合查询 多表联合查询的逻辑处理过程如下所示: JOIN:prepare阶段 setup_tables():对查询涉及的表,逐个查看是否存在,设置变量相应的值,为查询准备。 setup_fields():对查询的字段进行检查,不同于之前1.1的检查,该过程中如果不指定具体数据表的字段的话,将会对所有查询的数据表进行检查。 setup_conds():检查查询的where条件中字段是否存在,同样如果不指定具体数据表的字段,将会对所有查询的数据表进行检查。(sql_base.cc:8379) JOIN:optimize阶段 simplify_joins():如果可以将外连接简化为内连接处理,那么简化为内连接处理。此外,如果查询为内连接或者外连接查询使用的表拒绝 NULL值,那么将ON条件添加到where条件中,将表的连接操作转化为联合查询处理。在该测试中,由于没有显示的JOIN ON操作,因此不做以上处理。 optimize_cond():优化查询的where条件,对等值条件调用build_equal_items()(sql\sql_select.cc:8273

二叉排序树查找递归 非递归

我与影子孤独终老i 提交于 2019-12-03 02:41:38
算法思想 首先将待查关键字key与根结点关键字t进行比较,如果: 1)key=t,则返回根结点地址; 2)key<t,则进一步查找左子树; 3)key>t,则进一步查找右子树; 对应的递归算法如下: BSTree SearchBST(BSTree bst, ElemType key) { if (!bst) return NULL; else if (bst->key == key) return bst; else if (bst->key > key) return SearchBST(bst->lchild, key); else return SearchBST(bst->rchild, key); } 对应的非递归算法如下: BSTNode *BST_Search(Bitree T, ElemType key, BSTNode *&p) { p = NULL;//p指向待查找结点的双亲,用于插入和删除操作中 while(T!=NULL&&key!=T->data){ if (key < T->data) T = T->lchild; else T = T->rchild; } } 来源: https://www.cnblogs.com/brainstorm-yc/p/11774390.html

二叉树

匿名 (未验证) 提交于 2019-12-03 00:40:02
1、树   树的常用术语 2、二叉树 3、查找节点 4、插入节点 5、遍历树 6、查找最大值和最小值 7、删除节点     ①、删除没有子节点的节点   ②、删除有一个子节点的节点   ③、删除有两个子节点的节点   ④、删除有必要吗? 8、二叉树的效率 9、用数组表示树 10、完整的BinaryTree代码 11、哈夫曼(Huffman)编码   ①、哈夫曼编码    ②、哈夫曼解码 12、总结   前面我们介绍数组的数据结构,我们知道对于有序数组,查找很快,并介绍可以通过二分法查找,但是想要在有序数组中插入一个数据项,就必须先找到插入数据项的位置,然后将所有插入位置后面的数据项全部向后移动一位,来给新数据腾出空间,平均来讲要移动N/2次,这是很费时的。同理,删除数据也是。   那么我们就希望一种数据结构能同时具备数组查找快的优点以及链表插入和删除快的优点,于是 树 诞生了。 回到顶部 1、树    树 ( tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限 节点 通过连接它们的 边 组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。      ①、节点:上图的圆圈,比如A,B,C等都是表示节点。节点一般代表一些实体,在java面向对象编程中,节点一般代表对象。   ②、边

Informatica_(3)组件

匿名 (未验证) 提交于 2019-12-03 00:40:02
一、Informatica介绍 Informatica PowerCenter 是Informatica公司开发的世界级的企业数据集成平台,也是业界领先的ETL工具。 Informatica PowerCenter使用户能够方便地从异构的已有系统和数据源中抽取数据, 用来建立、部署、管理企业的数据仓库,从而帮助企业做出快速、正确的决策。 此产品为满足企业级要求而设计,可以提供企业部门的数据和电子商务数据源之间的集成, 如XML,网站日志,关系型数据,主机和遗留系统等数据源。 此平台性能可以满足企业分析最严格的要求。 Informatica PowerCenter已被全球多家著名企业用来建设BI/DW系统, 它可集成和分析企业的关键商务信息,优化整个商务价值链的表现和响应速度。 Informatica PowerCenter拥有一个功能强大的数据整合引擎, 所有的数据抽取、转换、装载的功能都是在内存中执行的,不需要开发者手工编写这些过程的代码。 Informatica PowerCenter 数据整合引擎是元数据驱动的, 通过知识库和引擎的配对管理,可以保证数据整合过程能够最优化执行, 并且使数据仓库管理员比较容易对系统进行分析管理,从而适应日益增加的数据装载和用户群。 二、informatica开发步骤: 定义源: Desinger 定义目标: Desinger 创建映射: 源--

查找算法――二分查找

匿名 (未验证) 提交于 2019-12-03 00:38:01
一、C 程序实现 /******************************************************************************************* *Description 二分查找算法 *Author liaoxiongxiong *Version 1.0 *Time 2018-04-28 *******************************************************************************************/ #include <stdio.h> //二分查找,版本1 int BinarySearch1(int a[], int value, int n) { int low, high, mid; low = 0; high = n-1; while(low<=high) { mid = (low+high)/2; if(a[mid] == value) return mid; if(a[mid]>value) high = mid-1; if(a[mid]<value) low = mid+1; } return -1; } //二分查找,版本2,递归版本 int BinarySearch2(int a[], int value, int low, int

一道二叉树查找的题目

匿名 (未验证) 提交于 2019-12-03 00:29:01
二叉树查找: 在二叉树中找结点E, 1.若该节点是叶结点,直接删除 2.若该节点只有Lchild, 则删除该节点,把Lchild防到原有的结点位置。 分析;涉及知识点 1.二叉树的建立(A(B(D(,G)),C(E,F)),如果不考察中序先序,中序后序建立,直接给出这种形式,怎样写二叉树建立的算法 2.二叉树节点的删除怎样写?细节问题,能写准不,人不应该好高骛远 3.在一棵普通二叉树中查找值等于k的节点,怎么写?要是还要求顺便找到他的父节点怎么写?要是在一棵二叉搜索树查找,算法怎么写? 6月18日更新C++实现 转载请标明出处: 一道二叉树查找的题目 文章来源: 一道二叉树查找的题目

散列/哈希总结

匿名 (未验证) 提交于 2019-12-03 00:22:01
哈希函数很强大,最近算法课老师讲了哈希函数的一系列应用。这里总结一下。 一、哈希表 哈希表(Hash Table)也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。它通过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度。这个映射函数就做散列函数,存放记录的数组叫做散列表。 以数据中每个元素的关键字K为自变量,通过散列函数H(k)计算出函数值,以该函数值作为一块连续存储空间的的单元地址,将该元素存储到函数值对应的单元中。 哈希表存储的是键值对,其查找的时间复杂度与元素数量多少无关,哈希表在查找元素时是通过计算哈希码值来定位元素的位置从而直接访问元素的,因此,哈希表查找的时间复杂度为O(1), 最坏的情况下查找一个元素的时间与在链表中查找一个元素的时间相同。最坏的情况下都是O(N)。有一个常用的概念定义为load factor(装载因子)算法导论中给的定义为:给定一个能存放n个元素的,具有m个槽位的散列表T。定义T的装载装载因子a为n/m,即一个链中平均存储的元素。 一个好的散列函数应满足简单一致散列的假设。每个关键字都等可能的散列到m个槽位的任何一个之中去,并与其它的关键字已被散列到哪一个槽位中无关。 二、散列函数 1.除法散列法 在用来设计散列函数的除法散列法之中,通过取k除以m的余数,来将关键字k映射到m个槽中去,定义散列函数为 h(k)=k

二分查找算法

匿名 (未验证) 提交于 2019-12-03 00:08:02
二分查找是一种查询效率非常高的查找算法。又称折半查找。 二分查找算法思想 有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。 一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 二分查找图示说明 图片来源百度图片,感谢分享者 二分查找优缺点 优点是比较次数少,查找速度快,平均性能好; 其缺点是要求待查表为有序表,且插入删除困难。 因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 使用条件:查找序列是顺序结构,有序。 public static void main(String[] args) { // write your code here System.out.print("二分法算法 :"); int[] arr = {1,3,5,7,9,11}; int value = 5; int index = binarySearch(arr,arr.length,value); System.out.print("算法 :"+ index); } //二分法排序 static

树、图、排序查找重要算法(960算法)

匿名 (未验证) 提交于 2019-12-03 00:06:01
设计求T的WPL的算法:   (1) .给出二叉树结点的数据类型定义;   (2) .给出C语言描述算法; 1 typedef struct node { int weight; struct node *left,*right; //指向结点左右子女的指针 }BiNode,*BiTree; 2 int WPL=0; void inorder(BiTree bt,level lv) //bt是二叉树,lv是结点的层次,初值为1 { if(bt) {inorder (bt->left,lv+1); //中序遍历左子树 if(bt->left==null &&bt->right==null) //判断该结点是否为叶子 WPL+=(lv-1)*bt->weight; //累加结点带权路径长度 inorder(bt->right,lv+1); } } NLR void PreOrder(BiTree T){ if(T!=NULL){ visit(T); //访问根结点 PreOrder(T->lchild); //递归遍历左子树 preOrder(T->rchild); } } LNR void InOrder(BiTree T){ if(T!=NULL){ InOrder(T->lchild); visit(T); InOrder(T->rchild); } } LRN void