zoukankan      html  css  js  c++  java
  • 查找算法

    之前课程中学习了栈、队列、二叉树这样一些典型的数据结构,这节课学习一些查找算法,所谓查找算法就是在一个数据结构当中找到我们想要的那个元素,由于二级公共基础所有的只是都是点到为止的,所以这里的查找算法也局限在线性查找这个部分。

    所以假设一个线性表中存储了6个数据,现在我们的任务是找74在哪个位置,查找到它在第4个位置,那么是怎么查找出来的呢?我们放慢刚才查找的动作,慢动作是从左往右一个一个看,比如第一个13不是,第二个25还不是,第三个9也不是,第四个74是的,这种查找方法非常普通没什么特别的,所以它的名字就叫做顺序查找。对于任何一种编程语言来说想完成这个算法都非常容易,如果是数组的话就对数组做一个循环遍历,然后都每个数组元素做if语句的判断就可以了。

    讲了它的原理现在来思考一个问题,使用顺序查找一个线性表,最坏情况下要比较多少次?我们想一想什么是最坏情况,从左往右查找,如果我们要找的数字刚好在线性表的最右端,这个就是最坏情况,所以要比较n次,所以说顺序查找是一种最简单也是效率最低的算法,它的时间复杂度是O(n),也就是说它是一种线性查找算法。

     接下来介绍一种效率更高的算法——二分查找,也叫对分查找,要想使用这种查找算法必须要有两个前提:第一个所有的数据都必须存储在顺序存储结构当中,比如数组,也就是说如果你使用的是一个线性链表的话就不能使用二分查找,第二个问题所有的数字必须从小到大或者从大到小排列好,也就是说这个线性表必须是一个有序的线性表。

    现在假设我们有一个数组,里面有1000个数是从小到大排列的,假设要找一个数字T,首先和第500个数比较,如果T>中间数,那么前面的一半就没有比较的必要了,如果T<中间数,那么后面的一半就没有比较的必要了。接下来就重复前面的操作,无论剩下的是前面的500个还是后面的500都和这500个数中间的那个比较,

     

     即使数据量很大有1000个也仅需要比较10次

     

     在查找算法中除了要查找一个指定的元素之外,还有一种情况就是查找整个线性表中最大的元素

    刚才是拿一个指定的数字和线性表中每一个数据比较,现在是没有数据,直接找出线性表中的最大数,这个时候怎么做呢?一般来说当我们遇到一个复杂的问题的时候首先要对问题进行简化,我们想一想如果n=2,也就是线性表中只有两个元素,这个时候要找最大项要比较多少次呢?显然只需要比较一次就可以了。如果n=3,比较2次。

  • 相关阅读:
    VS2010 自动跳过代码现象
    Reverse Linked List II 【纠结逆序!!!】
    Intersection of Two Linked Lists
    Linked List Cycle II
    Remove Nth Node From End of List 【另一个技巧,指针的指针】
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Remove Duplicates from Sorted List
    Linked List Cycle
    Dungeon Game
  • 原文地址:https://www.cnblogs.com/djlindex/p/12144968.html
Copyright © 2011-2022 走看看