算法简介

本文深入浅出地介绍了算法的基本概念,重点讲解了二分查找这一高效查找算法,并对比了其与简单查找的时间复杂度,同时引入了大O表示法来评估算法效率。通过实例解析,帮助读者理解算法在实际问题解决中的应用。

1.引言

      什么是算法?其实,任何代码都可以看作是算法。究其根本,就是完成一个任务的指令。但我们所要研究的算法是那些有意思的部分。

2.二分查找

      二分查找是一种基本且常见的查找算法。《算法图解》的作者将其作为第一个向我们介绍的算法。假如现在我们来玩猜数游戏,从1-100中找出对面那个娇羞的女孩子心里默念的数字。怎么猜才会最快呢?我想你肯定是先猜50,然后再根据大了还是小了,进行下一步猜测。比如25,或者是75?这样的话,你从1-100中猜出正确的数字最多只需要7次。这就是二分查找,你看,其实我们生活中一直都在使用它,只不过我们现在只是要给它取个名字而已。但是呢,二分查找的前提是,数字必须要是有序的。其实在算法中,很多时候都是要求我们进行操作的序列是有序的。所以在算法中,排序算法的使用是非常频繁的。而简单查找就是比较蠢萌的方式了,就是猜1,然后猜2,依次猜下去,一直到猜对为止。

      下面给出用循环写出的二分查找的代码。当然,也可以用递归来写这个查找方法。

package ver01;

import java.util.Arrays;

public class BinarySearch {
	public static void main(String[] args) {

		int[] a = buildArray(100);
		//System.out.println(Arrays.toString(a));
		binarySearch(a, 51);
	}

	public static int binarySearch(int[] array, int key) {   //二分查找方法
		int low = 0;                                          
		int high = array.length - 1;
		int j = 0;//用来计数
		while (low <= high) {
			int mid = (low + high) / 2;//要把这个放在循环体里面。因为每次的mid都不一样。写在外面就固定死了
			if (array[mid] == key) {
				j++;
				System.out.println("总共用了" + j + "步,找到了关键字!");
				return mid;
			} else if (array[mid] < key) {
				j++;
				low = mid + 1;
			} else {
				j++;
				high = mid - 1;
			}
		}
		System.out.println("没有找到!");
		return -1;

	}

	public static int[] buildArray(int num) {       //这个是用循环来生成有序数组的方法
		int[] numArray = new int[num];
		for (int i = 0; i < num; i++) {
			numArray[i] = i + 1;
		}
		return numArray;

	}

}

3.大O表示法

      《算法图解》这里面对这个的介绍比较详细。它指出的是算法的速度有多快。或者换个说法,就是不同的大O,他们的运行时间是以不同的速度增加的。以二分查找和简单查找为例,二分查找时间复杂度为O(log n),注意:算法里面的log不作特殊说明都是以2为底的。简单查找的为O(n)。从100个数找出一个数,二分查找的算出来为7,二简单查找算出来的是100.当从10亿个数中查找时,这个比例会更加夸张。

      下面给出常见的时间复杂度。好吧,其实这玩意就是时间复杂度,只不过《算法图解》这本书确实是一本入门的书籍。

      O(log n),也叫对数时间,常见的有二分查找。

      O(n),线性时间,包括简单查找。

      O(n*log n),快速排序。

      O(n^2),选择排序。

      O(n!),这种算法包括旅行商算法。

     

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值