算法系列15天速成——第四天 五大经典查找【上】

原文:算法系列15天速成——第四天 五大经典查找【上】

在我们的生活中,无处不存在着查找,比如找一下班里哪个mm最pl,猜一猜mm的芳龄....... 对的这些都是查找。

在我们的算法中,有一种叫做线性查找。

分为:顺序查找。

折半查找。

查找有两种形态:

分为:破坏性查找,   比如有一群mm,我猜她们的年龄,第一位猜到了是23+,此时这位mm已经从我脑海里面的mmlist中remove掉了。

哥不找23+的,所以此种查找破坏了原来的结构。

非破坏性查找, 这种就反之了,不破坏结构。

顺序查找:

这种非常简单,就是过一下数组,一个一个的比,找到为止。

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5  6 namespace Sequential 7 { 8     class Program 9     {10         static void Main(string[] args)11         {12             List<int> list = new List<int>() { 2, 3, 5, 8, 7 };13 14             var result = SequenceSearch(list, 3);15 16             if (result != -1)17                 Console.WriteLine("3 已经在数组中找到,索引位置为:" + result);18             else19                 Console.WriteLine("呜呜,没有找到!");20 21             Console.Read();22         }23 24         //顺序查找25         static int SequenceSearch(List<int> list, int key)26         {27             for (int i = 0; i < list.Count; i++)28             {29                 //查找成功,返回序列号30                 if (key == list[i])31                     return i;32             }33             //未能查找,返回-134             return -1;35         }36     }37 }

折半查找: 这种查找很有意思,就是每次都砍掉一半,

比如"幸运52“中的猜价格游戏,价格在999元以下,1分钟之内能猜到几样给几样,如果那些选手都知道折半查找,

那结果是相当的啊。

不过要注意,这种查找有两个缺点:

第一: 数组必须有序,不是有序就必须让其有序,大家也知道最快的排序也是NLogN的,所以.....呜呜。

第二: 这种查找只限于线性的顺序存储结构。

上代码:

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5  6 namespace BinarySearch 7 { 8     class Program 9     {10         static void Main(string[] args)11         {12             List<int> list = new List<int>() { 3, 7, 9, 10, 11, 24, 45, 66, 77 };13 14             var result = BinarySearch(list, 45);15 16             if (result != -1)17                 Console.WriteLine("45 已经在数组中找到,索引位置为:" + result);18             else19                 Console.WriteLine("呜呜,没有找到!");20 21             Console.Read();22         }23 24         ///<summary>25 /// 折半查找26 ///</summary>27 ///<param name="list"></param>28 ///<returns></returns>29         public static int BinarySearch(List<int> list, int key)30         {31             //最低线32             int low = 0;33 34             //最高线35             int high = list.Count - 1;36 37             while (low <= high)38             {39                 //取中间值40                 var middle = (low + high) / 2;41 42                 if (list[middle] == key)43                 {44                     return middle;45                 }46                 else47                     if (list[middle] > key)48                     {49                         //下降一半50                         high = middle - 1;51                     }52                     else53                     {54                         //上升一半55                         low = middle + 1;56                     }57             }58             //未找到59             return -1;60         }61     }62 }

先前也说过,查找有一种形态是破坏性的,那么对于线性结构的数据来说很悲惨,因为每次破坏一下,

可能都导致数组元素的整体前移或后移。

所以线性结构的查找不适合做破坏性操作,那么有其他的方法能解决吗?嗯,肯定有的,不过要等下一天分享。

ps:  线性查找时间复杂度:O(n);

折半无序(用快排活堆排)的时间复杂度:O(NlogN)+O(logN);

折半有序的时间复杂度:O(logN);

时间: 2024-10-21 05:23:48

算法系列15天速成——第四天 五大经典查找【上】的相关文章

算法系列15天速成——第五天 五大经典查找【中】

原文:算法系列15天速成--第五天 五大经典查找[中] 大家可否知道,其实查找中有一种O(1)的查找,即所谓的秒杀. 哈希查找: 对的,他就是哈希查找,说到哈希,大家肯定要提到哈希函数,呵呵,这东西已经在我们脑子里面形成 固有思维了.大家一定要知道“哈希“中的对应关系. 比如说: ”5“是一个要保存的数,然后我丢给哈希函数,哈希函数给我返回一个”2",那么此时的”5“ 和“2”就建立一种对应关系,这种关系就是所谓的“哈希关系”,在实际应用中也就形成了”2“是key,”5“是value. 那么有的

算法系列15天速成——第三天 七大经典排序【下】

原文:算法系列15天速成--第三天 七大经典排序[下] 今天跟大家聊聊最后三种排序: 直接插入排序,希尔排序和归并排序. 直接插入排序: 这种排序其实蛮好理解的,很现实的例子就是俺们斗地主,当我们抓到一手乱牌时,我们就要按照大小梳理扑克,30秒后, 扑克梳理完毕,4条3,5条s,哇塞......  回忆一下,俺们当时是怎么梳理的. 最左一张牌是3,第二张牌是5,第三张牌又是3,赶紧插到第一张牌后面去,第四张牌又是3,大喜,赶紧插到第二张后面去, 第五张牌又是3,狂喜,哈哈,一门炮就这样产生了.

算法系列15天速成——第七天 线性表【上】

原文:算法系列15天速成--第七天 线性表[上] 人活在社会上不可能孤立,比如跟美女有着千丝万缕的关系,有的是一对一,有的是一对多,有的是多对多. 哈哈,我们的数据也一样,存在这三种基本关系,用术语来说就是: <1>  线性关系. <2>  树形关系. <3>  网状关系. 一: 线性表 1 概念: 线性表也就是关系户中最简单的一种关系,一对一. 如:学生学号的集合就是一个线性表. 2 特征: ① 有且只有一个“首元素“. ② 有且只有一个“末元素”. ③ 除“末元素”

算法系列15天速成——第十一天 树操作(上)

原文:算法系列15天速成--第十一天 树操作(上) 最近项目赶的紧,歇了一个星期没写博客了,趁周末继续写这个系列. 先前我们讲的都是“线性结构”,他的特征就是“一个节点最多有一个”前驱“和一个”后继“.那么我们今天讲的树会是怎样的呢? 我们可以对”线性结构“改造一下,变为”一个节点最多有一个"前驱“和”多个后继“.哈哈,这就是我们今天说的”树“. 一: 树 我们思维中的”树“就是一种枝繁叶茂的形象,那么数据结构中的”树“该是怎么样呢?对的,他是一种现实中倒立的树. 1:术语 其实树中有很多术语的

算法系列15天速成——第一天 七大经典排序【上】

原文:算法系列15天速成--第一天 七大经典排序[上] 今天是开篇,得要吹一下算法,算法就好比程序开发中的利剑,所到之处,刀起头落. 针对现实中的排序问题,算法有七把利剑可以助你马道成功. 首先排序分为四种: 交换排序: 包括冒泡排序,快速排序. 选择排序: 包括直接选择排序,堆排序. 插入排序: 包括直接插入排序,希尔排序. 合并排序: 合并排序. 那么今天我们讲的就是交换排序,我们都知道,C#类库提供的排序是快排,为了让今天玩的有意思点, 我们设计算法来跟类库提供的快排较量较量.争取KO对手

算法系列15天速成——第六天 五大经典查找【下】

原文:算法系列15天速成--第六天 五大经典查找[下] 大家是否感觉到,树在数据结构中大行其道,什么领域都要沾一沾,碰一碰. 就拿我们前几天学过的排序就用到了堆和今天讲的”二叉排序树“,所以偏激的说,掌握的树你就是牛人了. 今天就聊聊这个”五大经典查找“中的最后一个”二叉排序树“. 1. 概念: <1> 其实很简单,若根节点有左子树,则左子树的所有节点都比根节点小. 若根节点有右子树,则右子树的所有节点都比根节点大. <2> 如图就是一个”二叉排序树“,然后对照概念一比较比较. 2

算法系列15天速成——第二天 七大经典排序【中】

原文:算法系列15天速成--第二天 七大经典排序[中] 首先感谢朋友们对第一篇文章的鼎力支持,感动中.......  今天说的是选择排序,包括“直接选择排序”和“堆排序”. 话说上次“冒泡排序”被快排虐了,而且“快排”赢得了内库的重用,众兄弟自然眼红,非要找快排一比高下. 这不今天就来了两兄弟找快排算账. 1.直接选择排序: 先上图: 说实话,直接选择排序最类似于人的本能思想,比如把大小不一的玩具让三岁小毛孩对大小排个序, 那小孩首先会在这么多玩具中找到最小的放在第一位,然后找到次小的放在第二位

算法系列15天速成——第十二天 树操作【中】

原文:算法系列15天速成--第十二天 树操作[中] 先前说了树的基本操作,我们采用的是二叉链表来保存树形结构,当然二叉有二叉的困扰之处,比如我想找到当前结点 的“前驱”和“后继”,那么我们就必须要遍历一下树,然后才能定位到该“节点”的“前驱”和“后继”,每次定位都是O(n),这 不是我们想看到的,那么有什么办法来解决呢? (1) 在节点域中增加二个指针域,分别保存“前驱”和“后继”,那么就是四叉链表了,哈哈,还是有点浪费空间啊. (2) 看下面的这个二叉树,我们知道每个结点有2个指针域,4个节点

算法系列15天速成——第九天 队列

原文:算法系列15天速成--第九天 队列 可能大家都知道,线性表的变种非常非常多,比如今天讲的“队列”,灰常有意思啊. 一:概念 队列是一个”先进先出“的线性表,牛X的名字就是“First in First Out(FIFO)”, 生活中有很多这样的场景,比如读书的时候去食堂打饭时的”排队“.当然我们拒绝插队. 二:存储结构 前几天也说过,线性表有两种”存储结构“,① 顺序存储,②链式存储.当然“队列”也脱离 不了这两种服务,这里我就分享一下“顺序存储”. 顺序存储时,我们会维护一个叫做”hea