查找算法

C++顺序表折半查找

自古美人都是妖i 提交于 2020-03-10 06:28:47
算法思想 折半查找:又称二分查找,适用于有序的顺序表。 先将中间位置元素与Key进行比较 若相等,则返回中间位置下标 若不相等: ① key<中间值,在左半边继续查找 ② key>中间值,在右半边继续查找 算法实现 int BinarySearch ( sqList L , int key ) { int low = 0 , high = L . length - 1 ; while ( low <= high ) //'<='很关键 { int mid = ( low + high ) / 2 ; if ( L . data [ mid ] == key ) return mid + 1 ; else if ( key < L . data [ mid ] ) high = mid - 1 ; else low = mid + 1 ; } return - 1 ; } 运行代码 # include "stdafx.h" # include <iostream> using namespace std ; # define MaxSize 50 typedef struct { int data [ MaxSize ] ; int length ; } sqList ; void Creat ( sqList & L ) ; int Search ( sqList L , int

数据结构 二分法查找

社会主义新天地 提交于 2020-03-08 11:18:09
/* 二分法查找 */ #include <stdio.h> #include <stdlib.h> #include <string.h> /* 二分法查找是一种在有序数组中查找特定元素的搜索算法 二分法查找的时间复杂度O(logn) */ //递归算法 int recurbinary(int *a, int key, int low, int high) { int mid; if (low > high) { return -1; } mid = low + (high - low) / 2; if (a[mid] == key) { return mid; } else if (a[mid] > key) { return recurbinary(a, key, low, mid - 1); } else { return recurbinary(a, key, mid + 1, high); } } //非递归算法 int binary(int *a, int key, int n) { int left = 0, right = n - 1, mid = 0; mid = left + (right - left) / 2; while (left < right && a[mid] != key) { if (a[mid] < key) { left = mid +

元类metaclass

依然范特西╮ 提交于 2020-03-08 03:09:52
一 前言 二 什么是元类 三 class关键字创建类的流程分析 五 自定义元类控制类OldboyTeacher的创建 六 自定义元类控制类OldboyTeacher的调用 六 再看属性查找 七 练习题 一 前言 元类属于python面向对象编程的深层魔法,99%的人都不得要领,一些自以为搞明白元类的人其实也只是自圆其说、点到为止,从对元类的控制上来看就破绽百出、逻辑混乱,今天我就来带大家来深度了解python元类的来龙去脉。 笔者深入浅出的背后是对技术一日复一日的执念,希望可以大家可以尊重原创,为大家能因此文而解开对元类所有的疑惑而感到开心!!! 二 什么是元类 一切源自于一句话:python中一切皆为对象。让我们先定义一个类,然后逐步分析 class OldboyTeacher(object): school='oldboy' def __init__(self,name,age): self.name=name self.age=age def say(self): print('%s says welcome to the oldboy to learn Python' %self.name) 所有的对象都是实例化或者说调用类而得到的(调用类的过程称为类的实例化),比如对象t1是调用类OldboyTeacher得到的 t1=OldboyTeacher('egon',18)

二分法查找算法 (递归)

眉间皱痕 提交于 2020-03-06 21:45:23
有一由小到大排列的数组m[],数组大小为n,请用二分法查找算法找出与关键数key相等的元素,若查找成功返回元素在数组中的位置,没找到返回-1. 1 // 二分查找.cpp 2 3 #include "stdafx.h" 4 #include <string> 5 6 int search(int m[],int key,int low,int high) 7 { 8 int mid=(low+high)/2; 9 if (low>high) 10 return -1; 11 if (key==m[mid]) 12 return mid; 13 else if (key<m[mid]) 14 return search(m,key,low,mid-1); 15 else 16 return search(m,key,mid+1,high); 17 } 18 19 void main() 20 { 21 int a[]={1,2,5,7,9,12,16}; 22 int i,len; 23 len=sizeof(a)/sizeof(a[0])-1; 24 i=search(a,12,0,len); 25 printf("%d\n",i); 26 } 来源: https://www.cnblogs.com/xingele0917/archive/2012/10/04/2711628

查找算法之二分查找

本秂侑毒 提交于 2020-03-06 09:01:57
查找算法 线性查找算法 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值。 思路:如果查找到全部符合条件的值。[思路分析.] 全部代码 package com.atguigu.search; public class SeqSearch { public static void main(String[] args) { int arr[] = { 1, 9, 11, -1, 34, 89 };// 没有顺序的数组 int index = seqSearch(arr, -11); if(index == -1) { System.out.println("没有找到到"); } else { System.out.println("找到,下标为=" + index); } } /** * 这里我们实现的线性查找是找到一个满足条件的值,就返回 * @param arr * @param value * @return */ public static int seqSearch(int[] arr, int value) { // 线性查找是逐一比对,发现有相同值,就返回下标 for (int i = 0; i < arr.length; i++) { if(arr[i] ==

算法——线性查找

回眸只為那壹抹淺笑 提交于 2020-03-06 05:59:40
线性查找也叫顺序查找,这是最基本的一种查找方法,从给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程。   如果元素个数为 N,那么线性查找的平均次数为: N/2   下面通过一个例子,演示线性查找: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class SequentialSearch { //定义一个数组,存放所有数据 static int [] array = null ; //定义一个 set 集合,用来排除数组中重复的数 Set<Integer> setNum = new HashSet<>(); //定义一个整型数,表示查找次数 int times = 0 ; /** * 根据传入的

二维数组中的查找

試著忘記壹切 提交于 2020-03-06 02:07:57
面试题四 二维数组中的查找 题目:在一个二维数组中,每一行都是按照从左到右递增的顺序排列,每一列都是按照从上到小递增的顺序排列。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。 解法:当然我们知道通过遍历完数组是可以找到的,但这不是我们的目的。因为每一行每一列都是递增顺序的,我们可以按照对角线的方向思考。 先思考一下正对角线,如果我们取正对角线上的一个数字n,如果n比要找的数m大,那么m就落在n的位置左边或者上边,由于这两片区域有重叠区域,接下来不好找,所以我们从反对角线来思考一下问题,可能要会简单点。 从右上角,取反对角线上的第一个数n,如果要找的数m比n大,那么m在n的位置下面;如果m比n小,那么m就在n的左边。按照这个方法,慢慢地排除一行一列,从而找到那个数,或者没有这个数。算法的时间复杂度为O(n),空间复杂度为O(1) 代码: # include <stdio.h> # include <iostream> using namespace std ; //在二维排序数组中找到某个数 bool findNumber ( int arr [ ] [ 4 ] , int rows , int cols , int num ) ; int main ( ) { int arr [ 4 ] [ 4 ] = { { 1 , 2 , 8 , 9 } , { 2

算法分析:如何分析一个算法的效率好坏?

时光毁灭记忆、已成空白 提交于 2020-03-06 00:30:28
/*--> */ /*--> */ 什么是算法分析 当我们说算法分析的时候我们在说什么?(狭义的技术层面的定义): 算法分析指的是: 对算法在运行时间和存储空间这两种资源的利用效率进行研究。 即时间效率和空间效率。 时间效率指算法运行有多快; 空间效率指算法运行时需要多少额外的存储空间。 (时间效率也叫时间复杂度;空间效率也叫空间复杂度。) 在计算机时代早期,时间和空间这两种资源都是及其昂贵的。但经过半个多世纪的发展,计算机的速度和存储容量都已经提升了好几个数量级。 现在空间效率已经不是我们关注的重点了 ,但时间效率的重要性并没有减弱到这种可以忽略的程度。 所以,当我们分析一个算法的的时候,我们 只关注它的时间效率 。 算法分析通用思路: 当我们遇到一个算法时,我们可以用这样一个通用的思路去分析它: 1. 输入规模 首先第一步考虑这个算法的输入规模是什么?即输入参数,再换句话说也就是待解决的问题有多大? 从这里入手是因为一个显而易见的规律就是, 不管使用什么算法,输入规模越大,运行效率肯定会更长。 输入规模的确定要根据具体要解决的实际问题的细节来决定,相同的问题不同的细节,输入规模是不一样的。比如:一个拼写检查的算法, 如果算法关注的是单独的字符检查,那么字符的数量就是输入规模的大小; 如果算法关注的是词组搭配的检查,那么这个输入规模就要比单独的字符检查的输入规模要小

算法图解(读书笔记)

*爱你&永不变心* 提交于 2020-03-05 15:15:17
第一章 二分查找 输入:一个 有序 的元素列表 过程:要查找的元素包含在列表中,二分查找返回其位置,否则返回NULL 对于包含n个元素的列表,用二分查找最多需要 l o g 2 n log_{2}n l o g 2 ​ n 步,简单查找最多需要 n n n 步 算法实现: def binary_search ( list , item ) : low = 0 high = len ( list ) - 1 while low <= high : mid = ( low + high ) / 2 #向下取整 guess = list [ mid ] if guess = item : reutrn mid if guess > item : high = mid - 1 else : low = mid + 1 return None #None 表示空,意味着没有找到指定元素 运行时间为对数时间(O( l o g n log n l o g n )) 最多需要猜测的次数与列表长度相同,这被称为 线性时间 (linear time) O(1)代表常量时间 大O表示法 大O表示法指出了算法运行时间的增速,指出了最糟情况下的运行时间 常见的大O运行时间 O ( l o g n ) O(log n) O ( l o g n ) :对数时间,比线性时间快,例如二分查找 O ( n ) O(n

Data Structures[翻译]

a 夏天 提交于 2020-03-05 14:24:52
Data Structures 【原文见: http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=dataStructures 】 作者 By timmac TopCoder Member 翻译 农夫三拳@seu drizzlecrj@gmail.com 即使计算机能够毫不夸张的每秒执行上百万次的数学运算,当一个问题变得庞大且复杂时,性能仍然是一个很重要的考虑方面。最至关紧要的关于快速解决问题的方面之一就是数据在内存中是如何存储的。 为了举例说明这点,可以试想你进入一个图书馆去查找某个学科的一本书。最有可能的是你能够使用一些电子参考或者在最坏情况下,有一个卡片目录来帮助你找到你想要的书的名称和作者。由于书籍都是按目录进行排放的并且在每一个目录中是按照作者的姓名排序的,因此这是一个直接并且轻松的过程,那么然后你就可以在书架上找到你想要的书了。 现在,假定你去图书馆找一本特定的书,然而这里没有排放好的书架,只有在房间角落有一些排成行的袋子,里面放满了可能相关可能不相关的书。这样就可能需要数个小时甚至数天来找到你需要的书了,这是一个对比性强的道理。这就是数据在没有存储为与应用相关的格式时软件运行的情况。 简单的数据结构(Simple Data Structures) 最简单的数据结构是原生的变量。他们存放单个值,并且使用中受限