查找算法

程序员,你心里就没点树吗?

雨燕双飞 提交于 2019-11-28 06:26:32
看官,不要生气,我没有骂你也没有鄙视你的意思,今天就是想单纯的给大伙分享一下树的相关知识,但是我还是想说作为一名程序员,自己心里有没有点树?你会没点数吗?言归正传,树是我们常用的数据结构之一,树的种类很多有二叉树、二叉查找树、平衡二叉树、红黑树、B树、B+树等等,我们今天就来聊聊二叉树相关的树。 什么是树? 首先我们要知道什么是树?我们平常中的树是往上长有分支的而却不会形成闭环,数据结构中的树跟我们我们平时看到的树类似,确切的说是跟树根长得类似,我画了一幅图,让大家更好的理解树。 图1、图2都是树,图3不是树。每个红色的圆圈我们称之为元素也叫节点,用线将两个节点连接起来,这两个节点就形成了父子关系,同一个父节点的子节点成为兄弟节点,这跟我们家族关系一样,同一个父亲的叫做兄弟姐妹,在家族里面最大的称为老子,树里面也是一样的,只是不叫老子,叫做跟节点,没有子节点的叫做叶子节点。我们拿图1来做示例,A为根节点,B、C为兄弟节点,E、F为叶子节点。 一颗树还会涉及到三个概念 高度 、 深度 、 层 ,我们先来看看这三个名词的定义: 高度 :节点到叶子节点的最长路径,从0开始计数 深度 :跟节点到这个节点所经历的边数,从0开始计数 层 :节点距离根节点的距离,从1开始计数 知道了三个名词的概念之后,我们用一张图来更加形象的表示这三个概念。 以上就是树的基本概念,树的种类很多

算法基础 - 查找两个有序数组的中位数

走远了吗. 提交于 2019-11-28 06:09:02
问题描述 问题很简单,就是在两个有序的整数数组里(数组A长度为m, 数组B长度为n),找到两个数组合并后的中位数。 要求时间复杂度 O(log(m+n)) 也就是说不能用先归并两个数组再直接查找的办法。 中位数 中位数就是在一个有序数组中,位于中间的数字,假如数组元素个数为偶数,则取两个中间数字的平均数。 例: 1,2,3,4,5 中位数为:3 1,2,3,4 的中位数为:2.5 算法讲解 这个问题其实看起来挺简单的,网上的一些博客里说的,很多都是一个大致思想,细节有误,代码也有误。真是误人子弟。 数组等长 假如数组等长的话,那么很简单就能解决,因为每次比较数组的中间数字,把数字大的数组扔掉右半边,把数字小的数组扔掉左半边,每次循环,到最后就能知道中位数是多少了。 But!注意事项 你以为这么简单就OK了? 当然不是!在数组等长的时候需要注意以下几个问题。 数组等长,说明数组AB的元素和为偶数,最后求的的中位数一定是两个中间数字的平均。 数组在递归的分割过程中,出现两个数组都是偶数个数的时候,比较的其实不是中间的数字(是中间偏下的数字)。因此在遇到数组如: 3,4,5,6与1,2,7,8 的时候,第一次比较是 4 和 2 发现 4 比较大,因此把 5,6 扔掉,另外一个数字扔掉 1,2 ,但是我们可以发现,这个两个数组的中位数是 4,5 两个数字的平均数 4.5

常见的查找算法(七):哈希查找

倖福魔咒の 提交于 2019-11-28 05:58:16
散列表 ( Hash table ,也叫 哈希表 ),是根据 键 (Key)而直接访问在内存存储位置的 数据结构 。也就是说,它通过计算一个关于键值的函数,将所需查询的数据 映射 到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做 散列函数 ,存放记录的数组称做 散列表 。 散列函数 的规则是:通过某种转换关系,使关键字适度的分散到指定大小的的顺序结构中,越分散,则以后查找的时间复杂度越小,空间复杂度越高。 直接定址法 :取关键字或关键字的某个线性函数值为散列地址。即 hash(k) = k 或 hash(k) = a · k + b,其中a、b 为常数(这种散列函数叫做自身函数) 数字分析法 :假设关键字是以 r 为基的数,并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成哈希地址。 平方取中法 :取关键字平方后的中间几位为哈希地址。通常在选定哈希函数时不一定能知道关键字的全部情况,取其中的哪几位也不一定合适,而一个数平方后的中间几位数和数的每一位都相关,由此使随机分布的关键字得到的哈希地址也是随机的。取的位数由表长决定。 折叠法 :将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。 随机数法 除留余数法 :取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。即 hash(k) =

图像检索-乘积量化

ⅰ亾dé卋堺 提交于 2019-11-28 05:38:14
参考链接:https://blog.csdn.net/guanyonglai/article/details/78468673 看了两天的乘积量化,先说下我自己的理解吧:(以下蓝字使我的理解,红字是我看别人的博客暂时没弄懂的,我写的比较啰嗦以便我回头自己翻看时不会再有疑问(#^.^#)) 假设我们的图片检索库有100万张图片,每张图片提取多个128维的特征向量,把这128维向量分成8个短向量,每个短向量是16维,也就是说检索库总共包含100万*8这么多向量(我们暂且称为8堆短向量,每一堆有100万个短向量),我们把每一堆短向量都用 k-means 聚类为 256 类。对于检索库里面的每一张图片都由多个128维的向量表示,把每个128维的向量分为8个16维的短向量,对于每一个短向量我们都找到他属于一堆短向量的256类中的哪一类(可是这里如果归错类了那么查找图片岂不是一步错步步错?又一疑问:如果把大量的库图片归类为这256类呢,而且还要索引好每一张图片的需要以方便查找,k-means算法可以具体实现这一步骤吗?),依此类对,8个短向量分别在8个堆中查找属于256类中的哪一类,这样一张图片8个短向量的每一个短向量都有256种选择,即一张图片总共有256的8次方种选择(2的64次方,即相当于一幅图片的特征可以表示为64位(8*8bit)二进制数),这样图片库的数量就可以很大了(2的64次方

常见的查找算法(五):树表查找之一

牧云@^-^@ 提交于 2019-11-28 03:57:31
二叉查找树 ( 英语: Binary Search Tree),也称为 二叉搜索树 、 有序二叉树 ( ordered binary tree)或 排序二叉树 ( sorted binary tree),是指一棵空树或者具有下列性质的 二叉树 : 若任意节点的 左子树不空 ,则左子树上所有节点的值 均小于 它的根节点的值; 若任意节点的 右子树不空 ,则右子树上所有节点的值 均大于 它的根节点的值; 任意节点的左、右子树也分别为二叉查找树; 没有 键值 相等的节点。 二叉查找树的节点 : 1 //二叉树节点 2 static class BSTNode<T> { 3 T data; 4 BSTNode<T> parent; 5 BSTNode<T> left; 6 BSTNode<T> right; 7 8 public BSTNode() { 9 this.data = null; 10 this.left = left; 11 this.right= right; 12 } 13 14 public BSTNode(T data) { 15 this(data,null, null); 16 } 17 18 public BSTNode(T data, BSTNode<T> left, BSTNode<T> right) { 19 this.data = data; 20

常见的查找算法(四):斐波那契查找

…衆ロ難τιáo~ 提交于 2019-11-28 01:36:47
斐波那契搜索技术 是一种使用 分而治之算法 搜索 已 排序数组 的方法,该 算法 借助 斐波纳契数 来缩小可能的位置。 与 二元搜索 相比,排序数组被分成两个大小相等的部分,其中一个进一步检查,斐波那契搜索将数组分成两个部分,其大小为连续的斐波纳契数。平均而言,这导致执行的比较增加了大约4%, 但它的优点是只需要加法和减法来计算被访问数组元素的索引,而经典二进制搜索需要比特移位,除法或乘法,这些 操作在Fibonacci搜索时首先不常见出版。Fibonacci搜索具有 O(log n ) 的平均和最差情况复杂度。 总的来说是 二分查找 的一个优化。 Fibonacci序列 具有一个数字是其前面两个连续数的总和的属性。因此,可以通过重复添加来计算序列。两个连续数字的 比率 接近 黄金比率 ,1.618 ...二进制搜索通过将搜索区域除以相等的部分(1:1)来工作。Fibonacci搜索可以将其分成接近1:1.618的部分,同时使用更简单的操作。 构建 斐波那契 序列 数组(越到后面,前一个数与后一个数的比例接近0.618): 1 //构建斐波那契数列 2 public static void fibonacci(int[] F) { 3 F[0] = 0; 4 F[1] = 1; 5 for (int i = 2; i < max_size; ++i) 6 F[i] = F[i -

查找算法(I) 顺序查找 二分查找 索引查找

走远了吗. 提交于 2019-11-27 23:29:58
查找   本文为查找算法的第一部分内容,包括了基本概念,顺序查找、二分查找和索引查找。关于散列表和B树查找的内容,待有空更新吧。 基本概念   查找(search)又称检索,在计算机上对数据表进行查找,就是根据所给条件查找出满足条件的第一条记录(元素)或全部记录。   若没有找到满足条件的记录,则返回特定值,表明查找失败;若查找到满足条件的 第一条记录,则表明查找成功,通常要求返回该记录的存储位置或记录值本身,以便进行进一步处理;若需要查找到满足条件的所有记录,则可看做在多个区间内连 续查找到满足条件的第一条记录的过程,即首先在整个区间内查找到满足条件的第一条记录,接着在剩余的区间内查找满足条件的第一条记录,以此类推,直到剩余 区间为空为止。   作为查找对象的表的结构不同,其查找方法一般也不同。   查找过程是关键字比较的过程,比较次数的多少就是相应算法的时间复杂度,它是衡量一个查找算法优劣的重要指标。   对于一个查找算法的时间复杂度,还可以采用平均查找长度(Average Search Length, ASL),即在查找成功情况下的平均比较次数来表示。   平均查找长度的计算公式为:   ASL=∑p i ci   其中n为查找表的长度,即表中所含元素的个数,p i 为查找第i个元素的概率, c i 为查找第i个元素时所需的比较次数。   若查找每个元素的概率相同

顺序查找与二分查找算法

三世轮回 提交于 2019-11-27 23:29:44
顺序查找算法 顺序查找是非常简单常用的查找算法,基本思路:从第一个元素m开始逐个与需要查找的元素x进行比较,当比较到元素值相同(即m=x)时返回元素m的下标,如果比较到最后都没有找到,则返回-1。该算法的时间复杂度为O(n),如果数据量很大时查找效率会很低。 1 #include<stdio.h> 2 3 /* 顺序查找算法 4 a为数据数组,len为数组a的长度,x为查找的元素 5 如果查找成功返回元素x在数组a中的下标,找不到则返回-1 6 */ 7 int search(int a[],int len, int x) 8 { 9 int i; 10 for (i=0; i<len; i++) 11 { 12 if(x==a[i]) 13 return i; // 返回元素的下标 14 } 15 return -1; // 没有找到 16 } 17 18 int main() 19 { 20 int a[10]={1,3,5,2,0,9,8,4,7,6}; 21 int x=2; // 需要查找的元素 22 int i = search(a, 10, x); 23 if(i!=-1) 24 printf("元素%d在第%d个位置\n",x,i+1); 25 else 26 printf("没有找到元素:%d\n",x); 27 return 0; 28 } 二分查找算法

查找算法(I) 顺序查找 二分查找 索引查找

一曲冷凌霜 提交于 2019-11-27 23:29:32
查找   本文为查找算法的第一部分内容,包括了基本概念,顺序查找、二分查找和索引查找。关于散列表和B树查找的内容,待有空更新吧。 基本概念   查找(search)又称检索,在计算机上对数据表进行查找,就是根据所给条件查找出满足条件的第一条记录(元素)或全部记录。   若没有找到满足条件的记录,则返回特定值,表明查找失败;若查找到满足条件的第一条记录,则表明查找成功,通常要求返回该记录的存储位置或记录值本身,以便进行进一步处理;若需要查找到满足条件的所有记录,则可看做在多个区间内连续查找到满足条件的第一条记录的过程,即首先在整个区间内查找到满足条件的第一条记录,接着在剩余的区间内查找满足条件的第一条记录,以此类推,直到剩余区间为空为止。   作为查找对象的表的结构不同,其查找方法一般也不同。   查找过程是关键字比较的过程,比较次数的多少就是相应算法的时间复杂度,它是衡量一个查找算法优劣的重要指标。   对于一个查找算法的时间复杂度,还可以采用平均查找长度(Average Search Length, ASL),即在查找成功情况下的平均比较次数来表示。   平均查找长度的计算公式为:   ASL=∑p i ci   其中n为查找表的长度,即表中所含元素的个数,p i 为查找第i个元素的概率, c i 为查找第i个元素时所需的比较次数。   若查找每个元素的概率相同

查找算法:二分查找、顺序查找

一个人想着一个人 提交于 2019-11-27 23:29:15
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见: http://blog.csdn.net/xiaowei_cqu/article/details/7747205 查找算法 查找算法是在存在的序列(list) 中查找特定的目标(target),要求序列中每个记录必须与一个关键词(key)关联才能进行查找。 查找算法通常需要两个输入: 1、被查找的序列 2、要查找的关键词 查找算法的输出参数和返回值: 1、返回类型为 Error_code 的值用以表示是否查找成功 2、如果查找成功,返回 success, 输出参数 position 定位到目标所在位置 3、如果查找失败,返回 not present,输出参数可能是未定义或不同于已有位置的任何值 顺序查找算法 顺序查找算法的思路很简单:从表的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。 【实验说明】 题目:编写一个程序,对顺序表{3,6,2,10,1,8,5,7,4,9},采用顺序查找关键字5的过程。要求输出: 1)原顺序表;2)查找到关键字的位置;3)进行比较的次数。 1.首先要编写类表List。需要满足最基本的操作插入insert(),获取retrieve(),以及得到大小size()。 2