查找算法

开发中常见的算法汇总一览

心已入冬 提交于 2019-12-07 22:00:39
我们知道计算机中各类应用程序随处可见的,而支撑这些应用程序运行的就是各类数据结构以及各类算法,这就是经典等式 程序=数据结构+算法 ,上一篇幅中我们列举了一些常用的数据结构,那么今天我们来捋一捋日常开发中常见的一些算法思想以及具体算法各自的特性及相关指标 文章目录 常见算法思想 穷举法(Brute Force) 核心思想 特性 适用问题或算法 分治法(Divide and Conquer) 核心思想 特性 适用问题或算法 贪心算法(Greedy) 核心思想 特性 适用问题或算法 动态规划法(Dynamic Programming) 核心思想 特性 适用问题或算法 回溯法(Backtracking) 核心思想 特性 适用问题或算法 分枝界限法(Branch and Bound) 关于递归(画外音) 贪心和动态规划(画外音) 常见的算法分类 排序算法 冒泡排序 插入排序 希尔排序 选择排序 归并排序 快速排序 堆排序 计数排序 桶排序 基数排序 排序算法总结 查找算法 顺序查找 二分查找 散列查找 二叉树查找 搜索算法 树的层次遍历 树的(前/中/后)序遍历 常见算法思想 我们首先介绍下几种常见的算法思想,日常中一些具体的解题算法的思想都依赖于它们,文中列举一些具体算法问题可以自行通过搜索引擎了解 穷举法(Brute Force) 核心思想 顾名思义就是列举出所有可能出现的情况

java 查找算法

*爱你&永不变心* 提交于 2019-12-06 20:46:31
1、顺序查找 public class OrderSearch { /**顺序查找平均时间复杂度 O(n) * @param searchKey 要查找的值 * @param array 数组(从这个数组中查找) * @return 查找结果(数组的下标位置) */ public static int orderSearch(int searchKey,int... array){ for(int i=0;i<array.length;i++){ if(array[i]==searchKey){ return i; } } return -1; } /**测试查找结果 * @param args */ public static void main(String[] args) { int[] test=new int[]{1,2,29,3,95,3,5,6,7,9,12};//升序序列 int index=OrderSearch.orderSearch(95, test); System.out.println("查找到的位置 :"+ index); } } 二分查找 算法思想:又叫折半查找, 要求待查找的序列有序 。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程

常用查找算法及实现

被刻印的时光 ゝ 提交于 2019-12-06 20:46:11
一、顺序查找 线性查找是在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是 让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺 点是效率低下。 1、算法原理 1)从表中的最后一个记录开始,逐个进行记录的关键字与给定值进行比较,若某个记录的关 键字与给定值相等,则查找成功,找到所查的记录; 2)反之,若直到第一个记录,其关键字和给定值比较都不相等,则表明表中没有所查的记 录,查找失败。 2、算法分析 顺序查找的平均查找长度(Average Search Length,ASL)为(n+1)/2,当查找 不成功 时,需 要n+1次比较,时间复杂度为O(n); 3、算法实现 /* 顺序查找。 */ #include <iostream> #include <stdio.h> int SequenceSearch( int *array, int n, int key ) { if( array == NULL || n < 0 ) { printf( "invalid input.\n" ); return -1; } int i ; array[ 0 ] = key; for( i = n; array[ i ] != array[ 0 ]; i-- ) { if( array[ i ] == key ) break; } if(

Linux shell命令总结大全

[亡魂溺海] 提交于 2019-12-06 16:36:45
Linux shell命令总结大全 微信号 PythonSomething 功能介绍 人生苦短,我用Python。这里是Python算法与技术学习园地。 各大互联网公司的技术达人和你一起学Python。 01 前言 Linux shell命令应该算是非常入门的东西,但是实际上在使用的时候,会遇到各种各样的问题,前几天我在我们的项目上需要做一个功能,根据进程名字杀死这个进程,下面是过程 1、我们正常需要的操作是 $ps |grep xxx $kill -9 xx 2、kill命令是常用的,但是用killall命令会更快 $killall -9 xxx 3、令我困扰的是我用的那个没有killall然后我做了下面的操作 $adb shell ps |grep speech |awk '{print $2}' > 1.txt $cat 1.txt |xargs -n1 adb shell kill -9 我用这个的原因是用一条指令重定向总是各种问题,正常情况下用这条就可以了 $adb shell ps |grep speech |awk '{print $2}'|xargs -n1 kill -9 02 正文 关机/重启 关机(必须用root用户)shutdown -h now ## 立刻关机shutdown -h +10 ## 10分钟以后关机shutdown -h 12:00:00 #

查找算法

最后都变了- 提交于 2019-12-06 16:30:33
线性查找 public class SeqSearch { public static void main(String[] args) { int[] arr = {1, 9, 11, -1, 34, 89}; int index = serSearch(arr, 11); if (index == -1) { System.out.println("没有找到该值"); } else { System.out.println("找到,下标为: " + index); } } /** * 线性查找,找到一个满足条件的值就返回 */ public static int serSearch(int[] arr, int value) { // 线性查找是逐一对比,发现有相同的值,就返回下标 for (int i = 0; i < arr.length; i++) { if (arr[i] == value) { return i; } } return -1; } } 二分查找 二分查找是一种查询效率非常高的查找算法。又称折半查找。 算法思想: 对有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。 注意: 使用二分查找的前提是数据是有序的。 查值索引的计算公式为: mid = (low + high) / 2 递归实现二分查找

2 线性表

狂风中的少年 提交于 2019-12-06 12:05:46
转:https://blog.csdn.net/csdn_aiyang/article/details/84863136 第1节:线性表 1.1 概念 线性表是一种简单的线性结构,特点是在非空的有限集合中,且第一个元素没有直接前驱元素,最后一个元素没有直接后继元素,其他元素都有唯一的前驱和后继元素。线性表有顺序存储结构和链式存储结构。 1.2顺序存储结构 是指将线性表中的各个元素依次存放在一组地址连续的存储单元中,通常将这种方法存储的线性表称为顺序表。 假设,线性表的每个元素需占用m个存储单元,并以所占的第一个单元的存储地址作为数据元素的存储位置。则线性表中第i+1个元素的存储位置location(ai+1)和第i个元素的存储位置location(ai)之间满足关系location(ai+1)=location(ai)+m。线性表中第i个元素的存储位置与第一个元素的a1的存储位置满足以下关系,location(ai) =location(a1)+(i-1)*m。其中,第一个元素的位置location(a1)称为起始地址或基地址。 顺序表逻辑上相邻的元素在物理上也是相邻的。每一个数据元素的存储位置都和线性表的起始位置相差一个和数据元素在线性表中的位序成正比的常数。只要确定了第一个元素的起始位置,线性表中的任一个元素都可以随机存取,因此,线性表的顺序存储结构是一种随机存取的存储结构

k-d tree

柔情痞子 提交于 2019-12-06 09:17:28
转: https://www.cnblogs.com/eyeszjwang/articles/2429382.html k-d树(k-dimensional树的简称) 核心: 构建索引树,快速查找 下面是6个二维数据点{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}的k-d树空间划分示意图 二维数据k-d树空间划分示意图 算法主要有两步骤: 确定split的dimension :统计数据点每个dimension上的数据方差,选取方差最大的哪个dimension 确定数据分割点 :当前数据点集按其第split的那个dimension排序。位于正中间的那个数据点被选为Node-data,作为分割点 重复上述两个步骤,知道当前数据点集为空。 上述实例生成的k-d树 PS :每一级节点旁边的' x '和' y '表示以该节点分割左右子空间时split所取的 dimension 。 k-d树上的最邻近查找算法 关键:’ 回溯 ‘操作 -- 通过二叉搜索,顺着搜索路径很快就能找到最邻近的近似点。而找到的叶子节点并不一定就是最邻近的,最邻近肯定距离查询点更近,应该位于以查询点为圆心且通过叶子节点的圆域内。为了找到真正的最近邻,还需要进行' 回溯 '操作:算法沿搜索路径反向查找是否有距离查询点更近的数据点 一个复杂点的例子如查找点为(2,4.5)。先进行二叉查找,先从(7

散列表(哈希)

白昼怎懂夜的黑 提交于 2019-12-06 07:00:45
散列表 ( 哈希 ) 简介 简述 散列函数 冲突 开放地址法 链接法(也称链地址法) 链接法对比与开放地址法的优缺点 名词解释 我们来讲述散列表。 散列表是一种数据结构,它具有以下性质: 应用广泛 查找快速 等 举个例子。 你在超市工作,一位顾客来购买商品,你家超市刚刚好没有自动销售机,你得亲自去查找该商品的价格。如果我们是这样的话,那么顾客每买一个商品,都要找一下该商品并且知道它的价格。那么我们非常花费时间。如果我们能够找到这样一个人:能够记住所有商品的价格的人。那么我们在帮顾客结账的时候将会非常快速。 即使你是用一个小本本把你商店的东西都记上了,并且是按照一定的顺序记号的。即使使用二分查找,那么我们也会花费一定的时间。想必此时顾客已经不耐烦了。他们可能会说:“怎么这么久!!!”,然后你的商店可能会产生很多很多的怨气...... 我们从数据结构的方面去看这个问题,那么所有的商品就有了这样的一个特性: 商品的key 以及 商品的 卫星数据 。 如果我们按照一个特殊的函数去把相对应的 KEY 值转换成另一个东西,并且记录在小本子上,我们只需直接翻到这个本子相对应的部分,就可以找到了该商品的价格了,以及还有其他的信息。 ---->BACK<---- 散列函数 那么我们的问题来了,我们该怎样创建这个数据类型呢?首先了解一下,散列函数 散列函数是“将输入映射到数字”

三种常用的查找算法

让人想犯罪 __ 提交于 2019-12-06 03:16:56
在最近的复习中,我复习三种常用的查找算法,它们分别是: 1 线性查找 2 二分查找 3 插值法 4 斐波那契查找 线性查找 首先我们进行线性查找的讨论,对于线性查找,我们所做的操作就遍历数组同时逐一比对找出相匹配的元素,具体代码如下 public int search(int[] arr,int value) { for(int i=0;i<arr.length;i++) { if(arr[i]==value) { return i; } } return -1;s } 又上述代码我们不难理解,线性查找就是遍历数组的同时逐一比对数组的值和要查找的值,如果相同则就返回对应的数组下标 二分查找 对于二分查找,我们首先计算mid的值,在此演示中,我们设置的mid值为(left+right)/2,如果要搜索的值大于数组下标为mid的值,则就将left的值设置为mid+1,继续遍历,如果要插入的值小于数组下标为mid的值,则就将right的值设置为mid-1,继续遍历,重复上述操作,直到找到对应的数组的下标为止,当发生left>right时,则说明数组中并没有要搜索的值,此时我们返回-1并结束循环。 public static int binarySearch(int[] arr,int left,int right,int findVal) { if(left>right) {

在排序数组中查找元素的第一个和最后一个

China☆狼群 提交于 2019-12-05 17:15:13
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值,返回 [-1, -1]。 示例 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 示例 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1] 解答: public int[] searchRange(int[] nums,int target){ int[] res={-1,-1}; if(nums!=null&&nums.length>0){ int _0=-1; int _1=-1; int lo=0; int hi=nums.length-1; while (lo<=hi){ int mid=(lo+hi)/2; if(nums[mid]>target){ hi=mid-1; }else if(nums[mid]<target){ lo=mid+1; }else{ int turnLeft=mid; int turnRight=mid; while (turnLeft>=lo||turnRight<=hi){ if(_0>-1&&_1>-1){ break; } if(_0==-1&&