数据结构与算法-为什么要使用算法

今天来说说为什么须要使用算法?

算法是什么?算法是:指解题方案的准确而完整的描写叙述。是一系列解决这个问题的清晰指令,算法代表着用系统的方法描写叙述解决这个问题的策略机制。也就是说,可以对一定规范的输入,在有限时间内获得所要求的输出。假设一个算法有缺陷,或不适合于某个问题,运行这个算法将不会解决这个问题。

不同的算法可能用不同的时间、空间或效率来完毕相同的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。(百度百科版)

说完了算法的概念,我们举个样例说一下为什么须要算法?

public class Test {

	/**
	 * 使用原始的循环计算等差数列
	 */
	private void originalMethod(long n) {
		System.out.println("**使用原始循环算法**");
		long startTime = System.currentTimeMillis();
		long sum = 0;
		for (long i = 0; i <= n; i++) {
			sum += i;
		}
		long endTime = System.currentTimeMillis();
		System.out.println("结果:" + sum);
		System.out.println("用时:" + (endTime - startTime));
	}

	/**
	 * 使用等差数列算法计算
	 *
	 * @param n
	 */
	private void advanceMethod(long n) {
		System.out.println("**使用等差数列算法**");
		long startTime = System.currentTimeMillis();
		long sum = 0;
		long a1 = 1;
		long an = n;
		sum = (a1 + an) * n / 2;
		long endTime = System.currentTimeMillis();
		System.out.println("结果:" + sum);
		System.out.println("用时:" + (endTime - startTime));
	}

	public static void main(String[] args) throws InterruptedException {
		Test test = new Test();
		long n = 1000;
		System.out.println("-------当n=" + n + "的时候------");
		test.originalMethod(n);
		test.advanceMethod(n);

		n = 1000000;
		System.out.println("-------当n=" + n + "的时候------");
		test.originalMethod(n);
		test.advanceMethod(n);

		n = 1000000000L;
		System.out.println("-------当n=" + n + "的时候------");
		test.originalMethod(n);
		test.advanceMethod(n);
	}
}

输出结果:

-------当n=1000的时候------

**使用原始循环算法**

结果:500500

用时:0

**使用等差数列算法**

结果:500500

用时:0

-------当n=1000000的时候------

**使用原始循环算法**

结果:500000500000

用时:3

**使用等差数列算法**

结果:500000500000

用时:0

-------当n=1000000000的时候------

**使用原始循环算法**

结果:500000000500000000

用时:2070

**使用等差数列算法**

结果:500000000500000000

用时:0

从上面的结果能够看见,使用循环算法的所用时间不断的添加,并且达到某个数量级之后(比如10的20次方)。预计我们等死也等不到结果出来,而反观使用等差数列算法。使用的实际都是0,当然,事实上不是0,仅仅只是太快了,没有显示出来而已。两个计算方式相互比較一下,算法的性能一下子就看出来了。

并且对于现今大数据来说,动不动就是几亿几十亿的数据,计算的过程比我们上面的更加复杂,所须要的时间就很多其它。这时候假设不使用对应的算法,解决一个问题的时间基本是不可预计的。因此,我们须要算法

时间: 2024-10-17 13:11:04

数据结构与算法-为什么要使用算法的相关文章

数据结构:单源最短路径--Dijkstra算法

Dijkstra算法 单源最短路径 给定一带权图,图中每条边的权值是非负的,代表着两顶点之间的距离.指定图中的一顶点为源点,找出源点到其它顶点的最短路径和其长度的问题,即是单源最短路径问题. Dijkstra算法 求解单源最短路径问题的常用方法是Dijkstra(迪杰斯特拉)算法.该算法使用的是贪心策略:每次都找出剩余顶点中与源点距离最近的一个顶点. 算法思想 带权图G=<V,E>,令S为已确定了最短路径顶点的集合,则可用V-S表示剩余未确定最短路径顶点的集合.假设V0是源点,则初始 S={V

【数据结构&amp;&amp;算法系列】KMP算法介绍及实现(c++ &amp;&amp; java)

KMP算法如果理解原理的话,其实很简单. KMP算法简介 这里根据自己的理解简单介绍下. KMP算法的名称由三位发明者(Knuth.Morris.Pratt)的首字母组成,又称字符串查找算法. 个人觉得可以理解为最小回溯算法,即匹配失效的时候,尽量少回溯,从而缩短时间复杂度. KMP算法有两个关键的地方,1)求解next数组,2)利用next数组进行最小回溯. 1)求解next数组 next数组的取值只与模式串有关,next数组用于失配时回溯使用. 在简单版本的KMP算法中,每个位置 j 的 n

c数据结构的字符串查找的Brute-Force算法

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,

数据结构与算法分析之简单排序算法

在排序算法中,简单排序主要有三种,分别为冒泡排序.选择排序.插入排序,学习理解好这三种排序算法有助于进一步研究数据结构与算法分析.下面,简单地谈一谈冒泡排序.选择排序.插入排序的原理及区别. 冒泡排序原理: 1.比较相邻的元素.如果前一个比后一个大,它们就交换. 2.每对元素都要进行同样的动作,从后往前比较. 3.每趟都会确定一个位置的元素,因此n个元素,需要n-1趟才能确定各个元素的位置. 例如:对23,4,56,11四个数进行冒泡排序. 第一趟 4,23,11,56 第二趟 4,11,23,

【数据结构】 字符串&amp;KMP子串匹配算法

字符串 作为人机交互的途径,程序或多或少地肯定要需要处理文字信息.如何在计算机中抽象人类语言的信息就成为一个问题.字符串便是这个问题的答案.虽然从形式上来说,字符串可以算是线性表的一种,其数据储存区存储的元素是一个个来自于选定字符集的字符,但是字符串由于其作为一个整体才有表达意义的这个特点,显示出一些特殊性.人们一般关注线性表都会关注其元素和表的关系以及元素之间的关系和操作,而字符串常常需要一些对表整体的关注和操作. 字符串的基本概念如长度,比大小,子字符串等等这些,只要有点编程基础的人都懂就不

数据结构Java实现(一)----算法概述

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4724692.html 联系方式:[email protected] [正文] 一.数据结构涵盖的内容: 二.算法的基本概念: 1.算法的概念: Algorithm,是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或者多个操作. 2.算法的特性: 有穷性:指令序列是有限的

数据结构与算法分析(六)——算法设计技巧

从算法的实现向算法的设计转变,提供解决问题的思路 1.贪心算法 一种局部最优算法设计思路,思想是保证每一步选择在当前达到最优.一个很常见的贪心算法案例是零钱找取问题. 调度问题:书上的调度问题比较简单,其目标是所有作业的平均持续时间(调度+运行)最短,无论是但处理器还是多处理器,最优解的方案总是按作业的长短排序进行调度.<计算机算法设计与分析>上的作业调度的目标是最后完成时间最小,这要稍微复杂一些. 霍夫曼编码:最优编码必定保持满树的性质,基本问题在于找到总之最小的满二叉树.最简单的霍夫曼编码

数据结构(十二)——排序算法

数据结构(十二)--排序算法 一.排序简介 1.排序的一般定义 排序是计算机中经常进行的操作,目的在于将一组无序的数据元素调整为有序的数据元素.序列:1,20,45,5,2,12排序后:1,2,5,12,20,45 2.排序的数学定义 3.排序的稳定性 如果序列中的两个元素R[i].R[j],关键字分别为K[i].K[j],并且在排序之前R[i]排在R[j]前面,如果排序操作后,元素R[i]仍然排在R[j]前面,则排序方法是稳定的:否则排序是不稳定的. 4.排序实现的关键 比较:任意两个数据元素

野生前端的数据结构练习(12)贪心算法

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的算法,它总是会选择当下最优解,而不去考虑单次递归时是否会对未来造成影响,也就是说不考虑得到的解是否是全局最优.在很多实际问题中,寻找全局最优解的代价是非常大的,这时候就可以通过求次优解来解决问题,这种思想其实在软件工程中很常见,例如React中著名的DOM Diff算法中需要对比两棵DOM树,树的完

Java数据结构之字符串模式匹配算法---KMP算法

本文主要的思路都是参考http://kb.cnblogs.com/page/176818/ 如有冒犯请告知,多谢. 一.KMP算法 KMP算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯指针,而是利用已经得到的"部分匹配"结果将模式向右"滑动"尽可能远的一段距离,继续进行比较.显然我们首先需要获取一个"部分匹配"的结果,该结果怎么计算呢? 二.算法分析 在上一篇中讲到了BF算法,