C#实现线性查找算法

线性查找,肯定是以线性的方式,在集合或数组中查找某个元素。

通过代码来理解线性查找

什么叫"线性"?还是在代码中体会吧。

首先需要一个集合或数组,如何得到呢?就生成一个固定长度的随机数组吧。然后输入一个查找key,如果找到就返回元素的索引,没找到就返回-1,就这么简单。

    class Program
    {
        private static int[] arr;
        private static Random r = new Random();
        static void Main(string[] args)
        {
            SeedData(10);
            ShowArray();
            Console.WriteLine("\n");
            Console.WriteLine("请输入要查找的整型数");
            var temp = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("您要查找的{0}所在的位置是{1}", temp, LinearSearch(temp));
            Console.ReadKey();
        }
        //线性查找
        private static int LinearSearch(int key)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[i] == key) return i; //找到就返回索引
            }
            return -1;//如果没找到就返回-1
        }
        //数组的种子数据
        private static void SeedData(int size)
        {
            arr = new int[size];
            for (int i = 0; i < size; i++)
            {
                arr[i] = r.Next(1, 100);
            }
        }
        //打印数组的所有元素
        private static void ShowArray()
        {
            foreach (var item in arr)
            {
                Console.Write(item + " ");
            }
        }
    }

以上,我们自己可以定义什么叫"线性查找"了。就是说,当我们输入一个查找的key,是按顺序依次查找集合中的每个元素(实际是通过循环遍历),如果找不到就返回一个值,比如-1,如果找到就返回该元素的索引位置。

时间复杂度

线性查找只是查找的一种最简单的算法,还有其它相对复杂的算法。如何来衡量各种算法的效率呢,答案是用"时间复杂度"来衡量的。任何的概念来源于实践,并不是凭空产生的,"时间复杂度"也一样。

O(1)

假设一个数组中有10个元素,需要比较第一个元素是否等于第二个元素,算法只需要运行一次就可以得出结果。如果数组中有100个元素呢?算法还是运行一次就得到结果。于是,人们就想:算法的运行和数组大小没有关系,就把这种算法叫做"常量运行时间"吧。但还不够直观,用什么图形表示呢?人们想出就用O(1)来表示吧。

O(1)虽然很直观,但很容易产生歧义。有些人认为:只有算法运行一次,并且运行的次数不随数组大小改变,就可以用O(1)表示了。这是很明显的"望文生义"。O(1)更准确的解释是:算法的运行次数是一个常量,不会随着数组大小而改变。

O(n)

生活的精彩来自多样性。假设一个数组中还是10个元素,需要比较第一个元素是否等于数组中任何其它元素,算法需要运行9次。如果数组中有100个元素呢,算法需要运行99次,也就是n-1次,算法运行的次数随着n的不同而发生改变。人们把这种算法写成O(n),1可以忽略不计,读成"n阶"。

O(n²)

假设还有一种算法,需要比较数组中的任何元素于其它元素是否相等。第一个元素,需要和后面n-1个元素比较,第二个元素需要和除了第一个元素之外的其后面n-2个元素比较......也就是:(n-1) + (n-2) + ... + 2 + 1,这个公式用笔在纸上简单推算一下,还可以提炼为n²/2-n/2,随着n的增大,常量因子可以忽略,写成O(n²),称为"平方运行时间",读成"n²阶"。

当n是几万,O(n²)算法在今天每秒运行几十亿次的个人计算机上,不会有明显的性能影响。但如果n变成几百万,就要求几万亿次计算,这样可能要几个小时来执行。更有甚者,如果n变成几十亿,计算需要几十年来完成。所以,每种算法都有它的适用范围。

现在,可以稍微完整地定义"时间复杂度"了,它是一个函数,定量描述了算法的运行时间。时间复杂度是在最坏情况下的时间复杂度。

常见的时间复杂度有:

  • O(1), 常数阶,比如Hash表的查找
  • O(log2n),对数阶,比如二分查找
  • O(n),线性阶
  • O(nlog2n),线性对数阶,比如快速排序的平均复杂度
  • O(n^2),平方阶,比如冒泡排序
  • O(n^3),立方阶,比如求最短路径的Floyd算法
  • O(n^k),k次方阶
  • O(2^n),指数阶,比如汉诺塔

什么是算法

是解决特定问题求解步骤的描述。在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

sum = 1     +     2     +     3 + ... + 100
sum = 100   +     99  +   98+ ... + 1
2*sum = 101*100 = 10100
sum = 5050

以上就是针对1到100求和的算法。对,是在18世纪,一个德国的小村庄,一个叫高斯的小孩想出来的,就这么神奇!

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • C#二分查找算法实例分析

    本文实例讲述了C#二分查找算法.分享给大家供大家参考.具体实现方法如下: // input array is assumed to be sorted public int BinarySearch(int[] arr, int x) { if (arr.Length == 0) return -1; int mid = arr.Length / 2; if (arr[mid] == x) return mid; if (x < arr[mid]) return BinarySearch(Get

  • C#实现平衡查找树

    目录 1. 2-3查找树 1.查找 2.向 2- 结点中插入新键 3.向一棵只含有一个 3- 结点的树中插入新键 4.向一个父结点为 2- 结点的 3- 结点中插入新键 5.向一个父结点为 3- 结点的 3- 结点插入新键 6.分解根结点 7.局部变换 8.全局性质 2.红黑二叉查找树 1.定义 2.一一对应 3.颜色表示 4.旋转 5.在旋转后重置父结点的链接 6.向单个 2- 结点中插入新键 7.向树底部的 2- 结点插入新键 8.向一棵双键树(即一个 3- 结点)中插入新键 9.颜色变换

  • c# 二分查找算法

    折半搜索,也称二分查找算法.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. A 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: B 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较. C 如果在某一步骤数组为空,则代表找不到.这种搜索算法每一次比较都使搜索范围缩小一半. 时间复杂度折半搜索每次把搜索区域减少一半,时间复杂度为. (n代表集合中元素的个数)空间复杂度 复制代码 代码如下: //

  • C#实现简单的二叉查找树

    二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排序树的存储结构.中序遍历二叉排序树可得到一个关键字的有序序列,一个无序序列可以通过构造一棵二叉排序树变成一个有序序列,构造树的过程即为对无序序列进行排序的过程.每次插入的新的

  • C#实现二叉查找树

    目录 1.实现API 1.数据结构 2.查找 3.插入 4.分析 有序性相关的方法和删除操作 1.最大键和最小键 2.向上取整和向下取整 3.选择操作 4.排名 5.删除最大键和删除最小键 6.删除操作 7.范围查找 8.性能分析 对于符号表,要支持高效的插入操作,就需要一种链式结构.但单链表无法使用二分查找,因为二分查找的高效来自于能够快速通过索引取得任何子数组的中间元素,链表只能遍历(详细描述).为了将二分查找的效率和链表的灵活性结合,需要更复杂的数据结构:二叉查找树.具体来说,就是使用每个

  • C#实现线性查找算法

    线性查找,肯定是以线性的方式,在集合或数组中查找某个元素. 通过代码来理解线性查找 什么叫"线性"?还是在代码中体会吧. 首先需要一个集合或数组,如何得到呢?就生成一个固定长度的随机数组吧.然后输入一个查找key,如果找到就返回元素的索引,没找到就返回-1,就这么简单. class Program { private static int[] arr; private static Random r = new Random(); static void Main(string[] a

  • Java实现的两种常见简单查找算法示例【快速查找与二分查找】

    本文实例讲述了Java实现的两种常见简单查找算法.分享给大家供大家参考,具体如下: 前言: 查找是指从一批记录当中找出满足制定条件的某一记录的过程. 在平常的程序的编写当中很多时候时用得上的,这里简单介绍两个查找算法 1. 快速查找: 这个是相当简单的,以数组举例,就用一个for循环去查找数组中需要查找的数据 例子: public static boolean quickSearch(int a[], int x) { boolean f = false; int length = a.leng

  • 基于JavaScript实现的顺序查找算法示例

    本文实例讲述了基于JavaScript实现的顺序查找算法.分享给大家供大家参考,具体如下: 对于查找数据来说,最简单的方法就是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果.这个方法叫做顺序查找,有时候也被叫做线性查找.它属于暴力查找技巧的一种. 顺序查找实现起来非常简单,代码如下: function generalSearch(arr,data){//普通的顺序查找,就是遍历一遍看是否找到 for(var i=0;i<arr.length;i++){ if(arr[i]==

  • PHP实现的折半查找算法示例

    本文实例讲述了PHP实现的折半查找算法.分享给大家供大家参考,具体如下: 定义:折半查找技术,也就是二分查找.它的前提是线性表中的记录必须是关键码有序(通常从大到小有序),线性表必须采用顺序存储. 折半查找的基本思想:取中间记录作为比较对象,若给定值与中间记录的关键字,则在中间记录的关键字相等,则查找成功:若给定值小于中间记录的作伴去继续查找:若给定值大于中间记录的关键字,则在中间记录的右半区继续查找.不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止. 实现代码: <?php

  • 查找算法之二分查找的C++实现

    二分查找 二分查找算法,说白了就是在有序的数组里面给予一个存在数组里面的值key,然后将其先和数组中间的比较,如果key大于中间值,进行下一次mid后面的比较,直到找到相等的,就可以得到它的位置. 前提:线性表中的记录必须是关键字有序(通常从小到大),线性表必须采用顺序存储. 基本思想:取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功:若给定值小于中间记录的关键字,则在中间记录的左半区继续查找:否则,在右半区查找.不断重复,直到查找成功或查找失败为止. #include<ios

  • Python实现七大查找算法的示例代码

    查找算法 -- 简介 查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素.     查找表(Search Table):由同一类型的数据元素构成的集合     关键字(Key):数据元素中某个数据项的值,又称为键值     主键(Primary Key):可唯一的标识某个数据元素或记录的关键字 查找表按照操作方式可分为:         1.静态查找表(Static Search Table):只做查找操作的查找表.它的主要操作是:         ①

  • Python查找算法之分块查找算法的实现

    一.分块查找算法 分块查找是二分法查找和顺序查找的改进方法,分块查找要求索引表是有序的,对块内结点没有排序要求,块内结点可以是有序的也可以是无序的. 分块查找就是把一个大的线性表分解成若干块,每块中的节点可以任意存放,但块与块之间必须排序.与此同时,还要建立一个索引表,把每块中的最大值作为索引表的索引值,此索引表需要按块的顺序存放到一个辅助数组中.查找时,首先在索引表中进行查找,确定要找的结点所在的块.由于索引表是排序的,因此,对索引表的查找可以采用顺序查找或二分查找:然后,在相应的块中采用顺序

  • Python 语言实现六大查找算法

    目录 一.顺序查找算法 二.折半查找算法 三.插补查找算法 四.哈希查找算法 五.分块查找算法 六.斐波那契查找算法 七.六种查找算法的时间复杂度 一.顺序查找算法 顺序查找又称为线性查找,是最简单的查找算法.这种算法就是按照数据的顺序一项一项逐个查找,所以不管数据顺序如何,都得从头到尾地遍历一次.顺序查找的优点就是数据在查找前,不需要对其进行任何处理(包括排序).缺点是查找速度慢,如果数据列的第一个数据就是想要查找的数据,则该算法查找速度为最快,只需查找一次即可:如果查找的数据是数据列的最后一

  • C语言编程之初识数组线性查找和二分查找

    目录 线性查找 二分查找 先来了解一下什么是查找, 额,好吧,这没什么可了解的, 就是查找数组中的某个元素的位置或是否存在. 就这,没了.直接了解查找算法吧. 线性查找 线性查找与二分查找有些差别. 数组内元素可以是混乱无序的,即没有按顺序储存.这方法很简单,就是从首元素开始,依此向后查找,比较.仅此而已.运用循环,依次对比. 看代码吧. #include <stdio.h> int main(void) { int arr[] = { 5,4,6,8,7,9,10,2,3,1 }; int

  • Java实现查找算法的示例代码(二分查找、插值查找、斐波那契查找)

    目录 1.查找概述 2.顺序查找 3.二分查找 3.1 二分查找概述 3.2 二分查找实现 4.插值查找 4.1 插值查找概述 4.2 插值查找实现 5.斐波那契查找 5.1 斐波那契查找概述 5.2 斐波那契查找实现 5.3 总结 1.查找概述 查找表: 所有需要被查的数据所在的集合,我们给它一个统称叫查找表.查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合. 查找(Searching): 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录).

随机推荐