查找算法

python 整数对查找

╄→尐↘猪︶ㄣ 提交于 2019-12-02 09:21:42
题目描述 请设计一个高效算法,找出数组中两数之和为指定值的所有整数对。 给定一个int数组 A 和数组大小 n 以及需查找的和 sum ,请返回和为sum的整数对的个数。保证数组大小小于等于3000。 测试样例: [1,2,3,4,5],5,6 返回:2 # -*- coding:utf-8 -*- import collections class FindPair: def countPairs(self, A, n, tsum): res = 0 setA = list(set(A)) setA.sort() start , end = 0 , len(setA)-1 dd = collections.defaultdict(int) for i in A : dd[i] += 1 while start < end : if setA[start]+setA[end] < tsum : start += 1 elif setA[start]+setA[end] > tsum : end -= 1 else : res += dd[setA[start]]*dd[setA[end]] start += 1 end -= 1 if setA[start]*2 == tsum : res += dd[setA[start]]*(dd[setA[start]]-1)//2

B树Java代码实现以及测试

随声附和 提交于 2019-12-02 07:29:35
  B树Java实现方式: /** * 一颗B树的简单实现。 * * @param <K> - 键类型 * @param <V> - 值类型 */ @SuppressWarnings("all") public class BTree<K, V> { private static Log logger = LogFactory.getLog(BTree.class); /** * B树节点中的键值对。 * <p/> * B树的节点中存储的是键值对。 * 通过键访问值。 * * @param <K> - 键类型 * @param <V> - 值类型 */ private static class Entry<K, V> { private K key; private V value; public Entry(K k, V v) { this.key = k; this.value = v; } public K getKey() { return key; } public V getValue() { return value; } public void setValue(V value) { this.value = value; } @Override public String toString() { return key + ":" + value; } } /**

Mysql_索引

有些话、适合烂在心里 提交于 2019-12-02 05:15:46
一、MYSQL的索引 索引(Index):帮助Mysql高效获取数据的一种数据结构。用于提高查找效率,可以比作字典。可以简单理解为排好序的快速查找的数据结构。 索引的作用:便于查询和排序(所以添加索引会影响where 语句与 order by 排序语句)。 在数据之外,数据库还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据。这样就可以在这些数据结构上实现高级查找算法。这些数据结构就是索引。 索引本身也很大,不可能全部存储在内存中,所以索引往往以索引文件的形式存储在磁盘上。 我们平时所说的索引,如果没有特别指明,一般都是B树索引。(聚集索引、复合索引、前缀索引、唯一索引默认都是B+树索引),除了B树索引还有哈希索引。 优点: A、提高数据检索效率,降低数据库的IO成本 B、通过索引列对数据进行排序,降低了数据排序成本,降低了CPU的消耗。 缺点: A、索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引也是占用空间的。 B、对表进行INSERT、UPDATE、DELETE操作时,MYSQL不仅会更新数据,还要保存一下索引文件每次更新添加了索引列字段的相应信息。 在实际的生产环境中我们需要逐步分析,优化建立最优的索引,并要优化我们的查询条件。 索引的分类: 1、单值索引 一个索引只包含一个字段,一个表可以有多个单列索引。 2、唯一索引

二分算法

戏子无情 提交于 2019-12-01 23:09:48
二分算法也称折半查找,是一种效率较高的查找方法。是一种在有序数组中查找某一特定元素的搜索算法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 首先,假设表中元素是升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个字表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一字表,否则进一步查找后一字表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到字表不存在为止,此时查找不成功。 来源: https://www.cnblogs.com/DreamFather/p/11720463.html

数据结构与算法——平衡二叉树

旧城冷巷雨未停 提交于 2019-12-01 21:34:38
1 引言 2 二叉搜索树 2.1 定义 2.2 性质 2.3 节点结构 2.4 创建二叉搜索树 2.5 查找 2.6 插入 2.7 删除 3 平衡二叉树 3.1 定义 3.2 平衡因子 3.3 节点结构 3.4 左旋与右旋 3.5 插入 1 引言   二叉树是数据结构中的重点与难点,也是应用较为广泛的一类数据结构。二叉树的基础知识在之前的数据结构与算法——二叉树基础中已经详细介绍。本篇文章将着重介绍两类二叉树,二叉搜索树和平衡二叉树。 2 二叉搜索树 2.1 定义   二叉搜索树又称二叉查找树,亦称为二叉排序树。设x为二叉查找树中的一个节点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个节点,则key[y] <= key[x];如果y是x的右子树的一个节点,则key[y] >= key[x]。 2.2 性质   (1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值;   (2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值;   (3)左、右子树也分别为二叉搜索树;   例如:图2.2.1所示的二叉树为一棵二叉搜索树。 图2.2.1   例如:图2.2.2所示不是一棵二叉搜索树,因为节点40的左孩子节点值为44,不满足二叉搜索树的定义。 图2.2.2 2.3 节点结构   二叉树的节点结构通常包含三部分,其中有:左孩子的指针

二分查找的递归实现和非递归实现

限于喜欢 提交于 2019-12-01 20:53:51
二分查找的递归实现和非递归实现【java】 (1)非递归实现二分查找。 算法是由静态方法binarySearch()实现的,它接受一个整数健和一个有序的int数组作为参数。如果该健存在于数组中,则返回他的索引,否则返回-1。 算法使用两个变量lo和hi,并保证如果健在数组中则它一定在a[lo…hi]中,然后方法进入一个循环,不断地将数组的中间健(索引为mid)和被查找的健比较。如果被查找的健等于a[mid],返回mid;否则算法将查找的范围缩小一半,如果被查找的健小于a[mid]就继续在左边查找,如果被查找的健大于a[mid]就继续在右边查找。 算法找到被查找的健,或者是查找范围为空时,该过程结束。 二分查找的时间复杂度O(logn)。 以下为二分查找的详细代码。 import java . util . * ; //导入必要的包。 public class BinarySearch2 { public static int binarySearch ( int [ ] a , int key ) { int lo = 0 ; //指向数组的第一个元素。 int hi = a . length - 1 ; //指向数组的最后一个元素。 while ( lo <= hi ) { int mid = ( lo + hi ) / 2 ; //取数组中间。 if ( key > a [

Redis深度历险,全面解析Redis14个核心知识点

拥有回忆 提交于 2019-12-01 19:04:32
本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。 传送门: https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 一、概述 二、数据类型STRING LIST SET HASH ZSET 三、数据结构字典 跳跃表 四、使用场景计数器 缓存 查找表 消息队列 会话缓存 分布式锁实现 其它 五、Redis 与 Memcached数据类型 数据持久化 分布式 内存管理机制 六、键的过期时间 七、数据淘汰策略 八、持久化RDB 持久化 AOF 持久化 九、事务 十、事件文件事件 时间事件 事件的调度与执行 十一、复制连接过程 主从链 十二、Sentinel 十三、分片 十四、一个简单的论坛系统分析文章信息 点赞功能 对文章进行排序 一、概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。 二、数据类型 What Redis data structures look

AVL平衡二叉查找树

醉酒当歌 提交于 2019-12-01 16:53:59
二叉排序树: 定义 二叉排序树,又叫二叉查找树,它或者是一棵空树;或者是具有以下性质的二叉树: 1. 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 2. 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 3. 它的左右子树也分别为二叉排序树。 比如下图就是一棵普通的二叉排序树: 如果按照中序遍历的顺序,一棵二叉排序树的输出结果就刚好是按照从小到大的顺序输出的,可以运用于二分算法。 先对其数据结构进行定义: typedef struct Binary_Tree_node { int data; //数据域 struct Binary_Tree_node* lchild, * rchild; //左右孩子结点 }Binode, * BiTree; 然后是插入操作: //假设没有相等的data,这里我们不考虑相等的数据 //插入结点 void Insert_Binary_Tree(BiTree& bst ,int t) //bst是根节点 { if (bst == NULL) //空树或者递归到了叶结点 { BiTree newp = new Binode; newp->data = t; newp->lchild = NULL; newp->rchild = NULL; bst = newp; } else { if (t > bst->data) /

算法天天练771:查找字符串出现的次数

房东的猫 提交于 2019-12-01 16:20:49
题目来源: https://leetcode.com/problems/jewels-and-stones/ 问题描述: 两个字符串J和S,找出S中出现过多少次J字符串里面包含的字符。 举例说明: 字符串J 字符串S 结果 aA aAAbsdfe 3 b BBAAAA 0 解决方案 双重遍历两个字符串,检查子串是否包含字符,时间复杂度Ο(n^2) public int numJewelsInStones(String J, String S) { int sum = 0; char[] jChar = J.toCharArray(); char[] sChar = S.toCharArray(); int jLength = jChar.length; int sLength = sChar.length; for(int i=0;i<jLength;i++){ for(int j=0;j<sLength;j++){ if(jChar[i] == sChar[j]) { sum ++; } } } return sum; } } 来源: https://www.cnblogs.com/xiaoyangjia/p/11692702.html

算法

坚强是说给别人听的谎言 提交于 2019-12-01 13:42:37
什么是算法 算法 (Algorithm): 一个计算过程, 解决问题的方法 Niklaus Wirth: "程序=数据结构+算法" 时间复杂度 详情 ⽤用来评估算法运⾏时间或者运行效率的一个式⼦ 一般来说, 时间复杂度高的算法比时间复杂度低的算法慢 常见的时间复杂度排序(按效率排序) O(1)<O(logn)<O(n)<O(nlogn)<o(n^2)<O(n^2logn)<O(n^3) 第一类 对于一个循环,假设循环体的时间复杂度为 O(n),循环次数为 m,则这个 循环的时间复杂度为 O(n×m) O(1) print('Hello World') print('Hello World') print('Hello lxx') print('Hello lyy') O(n) for i in range(n): print('Hello World') 第二类 对于多个循环,假设循环体的时间复杂度为 O(n),各个循环的循环次数分别是a, b, c...,则这个循环的时间复杂度为 O(n×a×b×c...)。分析的时候应该由里向外分析这些循环。 O(n**2) for i in range(n): for j in range(n): print('Hello World') for i in range(n): print('Hello World') for j in