您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法--基本知识

2016-08-01 09:47 507 查看
  数据结构对每个程序员来说都是必备的基础,也是各大公司面试的重中之重。而我也是作为一个初学者来学习Java版的数据结构,因此,我准备深入学习,并且用代码实现各种数据结构,希望我编写的这一系列博客能提供和我一样对数据结构不太了解的初学者提供帮助,如有错误,希望大家提出,本人不胜感激。

一 、数据结构与算法的概念

  数据结构是研究如何把现实中的数据存储到计算机中,它能使数据之间存在着某种特定的逻辑关系,从而人们能够有效的访问和处理这些数据。在数据结构中,主要存在这4种存储结构,分别为顺序结构、链式结构、散列结构和索引结构。

  

  算法是处理数据的方法,也是程序员解决问题的方法和思路,算法的效率决定了数据的处理速度,同时也表明了程序员的能力,因此算法对每个程序员都是至关重要的。本人认为编程最重要的是解决问题的能力,即思路和方法,然后才是coding的过程,coding其实就是将现实中的事物转换成代码的形式,是可以锻炼的,因此我们要注重培养自己的逻辑思维能力,个人见解,不喜勿喷。

  

  算法应该具有的5大特性,想必大家都知道:

  (1)有穷性:一个算法必须在执行一定的步骤后结束,否则程序死循环。

  (2)确定性:算法中的每一步都要有确定的含义。计算机是机器,而程序就是告诉它怎么走,否则   它会迷失方向的,不像人类那么聪明,哈哈。

  (3)可行性:算法中的每一步都必须是可行的,即每一步都能在有限的时间内完成,而不是无限的   执行,否则毫无意义。

  (4)输入:一个算法可以有0个或多个输入。

  (5)输出:一个算法至少有一个输出。如果没有输出该算法有毛用!

二 、算法的评价

  算法评价就是对算法的好坏进行评估。通常对于一件事情,会有很多不同的处理方法,我们肯定会选着最优的解决方案。比如去北京,不同地域的人会有不同的出行方式,对于天津,可能自驾是到达北京最快的方式,坐高铁可能会花费很多的等待时间。对于山东可能高铁是最快的方式,对于海南可能飞机是最快的方式。因此,我们在编写代码时,必须考虑算法的优劣。通常,我们采用一下5个指标对算法进行评估,即正确性、健壮性、可读性、时间复杂度和空间复杂度。前面三个指标大家应该都能理解,下面着重对时间复杂度和空间复杂度进行解释。

  

1、时间复杂度:

  时间复杂度表示算法从开始到结束所运行的时间,通常来说程序执行一次简单操作所花费的时间是相同的,比如加减乘除、赋值操作等等,因此算法的时间复杂度是指代码中进行简单操作运算次数的总和,通常用O(Order:数量级)来表示。时间复杂度通常有 O( 1 )、O( n )、O( log2n )、O( nlog2n )、O( n2)、O( n3 )、O( 2n )、O( n! )等形式,用最高次幂来表示。。下面举几个常见的例子来看看算法的时间复杂度。

其中O( 1 )表示时间运行是固定的,一般为简单的赋值语句和输出语句,即运行时间为常量。

循环语句的时间复杂度通常为O( n )、O( n2)、O( n3 ) 。例子如下:

int n = 100;
int count = 0;
for (int i = 0; i < n; i++) {
count++;
}


该算法的运算次数为n+2,取最高次幂,复杂度为O( n )

int n = 100;
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
count++;
}
}


该算法为2重for循环,运算次数为n2+2,时间复杂度为O( n2)

复杂度为O( log2n )的经典算法为二分搜索。

int[] array = {1,2,3,4,5,6,7,8};    //定义一个带查找的数组,必须是有序的
int k = array.length/2; //定义第一次查找数组的索引
int dest = 5;   //定义需要查找的值,在此我们只考虑存在的情况,即dest在数组中存在
while(true){    //死循环
if(array[k]==dest){
System.out.println(dest);
break;  //跳出循环
}
if(array[k]>dest){  //如果dest小于array[k],
k = k/2;
}
if(array[k]<dest){
k = (k+array.length)/2;
}
}


2、空间复杂度

  空间复杂度通常指是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。大部分情况下,算法的空间复杂度表示的为临时占用的存储空间,复杂度通常为O( 1 )。

int a = 10;
int b = 20;
int temp = a;
a = b;
b = temp;


上述算法为实现两个变量内容的交换,定义temp为临时存储空间,所以该算法的空间复杂度为O( 1 )。

三 、 总结

  了解基本概念是深入学习数据结构念是必要条件。另外,对于编写一个算法,我们需要将时间复杂度和空间复杂度相结合,使其效率最大化。编写本篇博客,我也深入地了解时间复杂度,接下来将真正将实现数据结构的具体操作方法 。敬请关注!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息