JAVA关于数据结构(转载)

一、数据结构涵盖的内容 

二、算法的基本概念:

1、算法的概念:

Algorithm,是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或者多个操作。

2、算法的特性:

  • 有穷性:指令序列是有限的
  • 确定性:每条语句的含义明确,无二义性
  • 可行性:每条语句都应在有限的时间内完成
  • 输入:零个或者多个输入
  • 输出:一个或者多个输出

3、算法与程序的区别:

程序:

  (program)程序是软件开发人员根据用户需求开发的、用程序设计语言描述的适合计算机执行的指令(语句)序列。

程序包含的四个要素:

          数据结构 + 算法 + 程序设计方法 + 编程语言

程序与算法不同。程序是算法用某种程序设计语言的具体实现。程序可以不满足算法的有穷性,比如操作系统也是一种程序,如果你愿意,你的电脑可以一直开着,保持操作系统的运行。

4、程序、算法、软件之间的关系:

程序:算法的计算机实现。用某种编程语言实现。

算法:表示问题的解。

软件:程序+文档

程序设计=数据结构+算 法

三、数据类型:

1、数据类型:

是指一个值的集合和定义在集合上的操作集合。例如:java的整数类型(Integer),就不仅仅表示整数数值的集合,还包括对整数类型进行的操作集合,加、减、乘、除、模等操作。

我们通常所指的数据类型是某种高级语言支持的基本数据类型。  比如java的基本数据类型:int、double、float、char等等。

Java中的数据类型:

2、抽象数据类型:

一个数学模型以及定义在这个模型上的一组操作(由用户定义,用以表示应用问题的数据模型)。

看起来抽象数据类型和数据类型的定义基本相同。不同点在于:数据类型通常是指某种高级语言的,而抽象数据类型用户重新设计,一种概念。这里的"抽象"的含义在于数学抽象。

  • 原子类型:比如整型
  • 固定聚合类型:比如复数,两个实数确定的次序构成
  • 可变聚合类型:比如汽车类型,构成的成分是不确定的。(因为小轿车、大卡车的构成是不同的)

抽象数据类型抽象的层次越高,那么可复用性也越高。比如:java中的Object是对所有对象的抽象,那么就可以作为所有类的父类。

五、算法的设计目标:

1、算法的设计目标:

(1)正确性:满足具体问题的解,基本目标。

(2)可读性:有利于人去理解算法。

(3)健壮性:输入非法数据,能适当做出处理,不产生莫名其妙的输出。

(4)高效性:包括时间的高效性(时间复杂度)和空间的高效性(空间复杂度)。

2、算法性能指标:

(1)算法的时间效率也称为时间复杂度。

(2)算法的空间效率也称为空间复杂度。

(3)同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。一个算法的评价主要从时间复杂度和空间复杂度来考虑

(4)算法时间的高效性和空间的高效性通常是矛盾的。所有一般只会取一个平衡点。(这里体现的是一种哲学思想,研究计算机,不就是研究时间和空间的概念嘛,鱼与熊掌不可兼得哦)

(5)通常我们假设程序运行在内存中,且内存容量足够使用,所以更多的是讨论时间复杂度。

六、算法的时间复杂度:

算法的时间复杂度反映了算法执行的时间长短。度量一个算法在计算机上执行的时间通常有两种方式:

  1.事后统计法:

  2.事前分析法:(常用)

    编写算法使用的高级语言

    编程产生的机器语言代码质量

    机器指令执行速度

    问题规模

注:算法的时间复杂度是由最深层嵌套语句的频度决定的。

2、O()函数:

  表示算法的时间效率与算法所处理的数据元素个数n函数关系的最常用函数,即O()函数。

定义:

  一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。看下图便知:

一般情况下,算法基本操作重复执行的次数是问题规模N的某个函数,算法的时间量度记作

T(n) =O(f(n))  f(n)----T(n)的数量级   

称作算法的渐进时间复杂度。

频度T(n):是指语句执行的次数。

f(n)--关于问题规模的某个函数,表示T(n)的数量级,只与问题问题规模(可能由多个变量表示)有关,

一般表示为问题规模的指数或对数,没有常数项。

例如:1、n、x、logxn   等。


情况一:T(n)与问题规模n无关

当算法的时间复杂度T(n)与问题规模n无关时,此时算法的时间复杂度T(n)=O(1)。

情况二:T(n)与问题规模n有关

例1:设数组a和b在前面部分已经赋值,求如下两个n阶矩阵相乘算法的时间复杂度:

for(i=0;i<n;i++)
 {
   for(j=0;j<n;j++)
   {
     c[i][j]=0;  //基本语句1
     for(k=0;k<n;k++)
     {
        c[i][j]=c[i][j]+a[i][k]*b[k][j];//基本语句2
     }
   }
 }

code:

例2:设n为如下算法处理的数据元素个数,求算法时间复杂度。代码如下:

for(i=1;i<=n;i=i*2)
{
   System.out.println(i);
}

Analysis:

例3:分析冒泡排序算法的时间复杂度。代码如下:

//冒泡排序算法
    public static void bubbleSort(int[] data) {

        if (data == null) {
            return;
        }

        for (int i = 0; i < data.length - 1; i++) {
            boolean flag = false;

            for (int j = 0; j < data.length - 1 - i; j++) {
                if (data[j] > data[j + 1]) {
                    int temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;
                    flag = true;
                }
            }

            if (!flag) {
                return;
            }
        }
    }

时间复杂度分析:

(1)最佳情况下,冒泡排序算法只需要遍历一次就能确定数组已经排序好了,此时的时间复杂度为O(n);

(2)最差情况下,需要进行n-1次遍历,则需进行n(n-1)/2次比较和记录移动,此时冒泡排序算法的时间复杂度T(n)=O(n2)。

3、时间复杂度的大小关系:

以下六种计算算法时间的多项式是最常用的。其关系为:

指数时间的关系为:

当n取很大的值时,指数时间算法和多项式时间算法在所需时间上非常悬殊。

小知识:

NP(nondeterministic polynomial)问题:是指算法复杂度难以用多项式表示的问题,算法复杂度通常是n的指数级,常规算法很难求解。

七、算法的空间复杂度:

空间复杂度是指算法在运行期间所需要的内存空间的数量级。记作:S(n)=O(f(n)),其中n为问题的规模(或大小)。

注:由于大部分算法的空间复杂度问题并不严重,并且算法的空间复杂度分析方法和算法的时间复杂度分析方法基本相同,所以一般数据结构只讨论算法的时间复杂度,不讨论算法的空间复杂度。

代码举例:分析如下算法的空间复杂度

static void reserse(int[] a,int[] b)
{
   int n= a.length;
   for(int i=0;i<n;i++)
   {
      b[i]=a[n-1-i];
   }
}

上方代码中,当程序调用reserse(a,b)函数时,要分配的内存空间包括:引用a,引用b,局部变量n和局部变量i;

因此f(n)=c;其中c为常量。所以该算法的空间复杂度S(n)=O(1)。

八、总结:

算法的时间复杂度和两个因素有关:算法中的最大嵌套循环层数;最大嵌套循环结构中每次循环的次数。

一般来说,具有多项式时间复杂度的算法是可以接受的;具有指数(不是对数)时间复杂度的算法,只有当n足够小时才可以使用。一般效率较好的算法要控制在O(N)或者O(log2 N)

备注:本文系转载。原地址:http://www.cnblogs.com/smyhvae/p/4724692.html

时间: 2024-10-20 22:07:28

JAVA关于数据结构(转载)的相关文章

Java NIO Channel [ 转载 ]

Java NIO Channel [ 转载 ] @author Java NIO系列教程(二) Channel Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. 通道可以异步地读写. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入. 正如上面所说,从通道读取数据到缓冲区,从缓冲区写入数据到通道.如下图所示: Channel的实现 这些是Java NIO中最重要的通道的实现: FileChannel D

java 基础数据结构

数据结构, 需要考虑两个方面: 1. 每个元素具体的存储方法 (java中是一个对象) 2. 元素之间的关系如何实现存储 (java中也是一个对象) 另外在java中, 已经可以把跟数据结构有关的一些方法写到一个类里了. 线性表 顺序表 c语言: 借助数组实现 #define INIT_SIZE 100; typedef struct { int elem[INIT_SIZE]; // 用来存储数组元素 int length; // 当前顺序表的长度 } SqList; // 元素之间的关系隐含

java项目——数据结构实验报告

java项目——数据结构总结报告 20135315  宋宸宁 实验要求 1.用java语言实现数据结构中的线性表.哈希表.树.图.队列.堆栈.排序查找算法的类. 2.设计集合框架,使用泛型实现各类. 3.API的编写,并导出. 4.使用TDD模式,对程序进行测试,利用TestSuite将各测试类整合到一起. 5.与小组成员实现代码的整合. 实验设计过程 首先自学集合框架章节的内容,初步设计相关的类. 根据数据结构课本的章节分类,实验各数据结构类. 在类的编写过程中,经过老师的指导,我准备使用泛型

java实现数据结构-线性表-顺序表,实现插入,查找,删除,合并功能

package 顺序表; import java.util.ArrayList; import java.util.Scanner; public class OrderList { /** * @param args * @author 刘雁冰 * @2015-1-31 21:00 */ /* * (以下所谓"位置"不是从0开始的数组下标表示法,而是从1开始的表示法.) * (如12,13,14,15,16数据中,位置2上的数据即是13) * * 利用JAVA实现数据结构-线性表-顺

Java 授权内幕--转载

在信息安全性领域,授权是世界的的中心,因为它是控制个体(即人.进程和计算机)对系统资源的访问权限的过程.直到最近,在 Java 安全体系结构中相关的问题都是“这段运行中的代码的访问权限是什么?” 随着 Java 认证和授权服务(Java Authentication and Authorization Service,JAAS)的引入,这种情况改变了.JAAS 首先是作为 JDK 版本 1.3 的平台扩展,之后作为 JDK 1.4 及以后版本的核心部分.在 JAAS 中,相关问题变成了“运行这段

Java基本数据结构总结

一直没有很仔细的系统学习Java,之前一直用的是python和c/c++,但是既然要走上大数据的道路,那么一定逃脱不开java的.下面在网上找到一些资料并结合相关的书进行整理总结. java.util包,包含集合框架.遗留的 collection 类.事件模型.日期和时间设施.国际化和各种实用工具类(字符串标记生成器.随机数生成器和位数组.日期Date类.堆栈Stack类.向量Vector类等).集合类.时间处理模式.日期时间工具等各类常用工具包.下面要介绍的Java版的数据结构就是在这个包中.

java 常用数据结构

本章介绍Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.例如,Java提供日期(Data)类.日 历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack).向量 (Vector) .位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构. 图1.1给出了java.util包的基本层次结构图.下面我们将具体介绍其中几个重要的类. ┌java.util.BitS

Java 输入输出流 转载

转载自:http://blog.csdn.net/hguisu/article/details/7418161 1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读写数据的标准方法.任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法. Java.io是大多数面向数据流的输入/输出类的主要软件包.此外,Java也对块传输提供支持,在

【转】Java学习---Java核心数据结构(List,Map,Set)使用技巧与优化

[原文]https://www.toutiao.com/i6594587397101453827/ Java核心数据结构(List,Map,Set)使用技巧与优化 JDK提供了一组主要的数据结构实现,如List.Map.Set等常用数据结构.这些数据都继承自 java.util.Collection 接口,并位于 java.util 包内. 1.List接口 最重要的三种List接口实现:ArrayList.Vector.LinkedList.它们的类图如下: 可以看到,3种List均来自 Ab