数据结构Java实现01----算法概述

2023-10-29

本文转载至:http://www.cnblogs.com/smyhvae/p/4724692.html

一、数据结构涵盖的内容:


二、算法的基本概念:

1、算法的概念:

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

2、算法的特性:

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

3、算法与程序的区别:

程序:

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

程序包含的四个要素:

数据结构

算法

程序设计方法

编程语言

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

比如:

while(true)

{

...

} //是一段程序,但不是一个算法

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

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

算法:表示问题的解。

软件:程序+文档

如下图所示:


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

 

三、数据类型:

1、数据类型:

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

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

Java中的数据类型:


2、抽象数据类型:

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

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

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

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

 

四、抽象数据类型的表示(代码举例):

  • Java语言使用类

下面用java语言,来定义学生抽象数据类型。已知学生的信息如下:

学号:111222

姓名:在奋斗的大道上

性别:男

出生日期:1991-11

专业:电子与通信工程(计算机方向)

电子邮箱:zhouzhiwengang@163.com

1、用Java代码定义一个学生类:

(1)Student.java:

package test1;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created by smyhvae on 2015/8/12.
 */
public class Student {
    String num; //学号
    String name; //姓名
    char sex; //性别
    Date birthday; //出生日期
    String contact; //联系方式

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getContact() {
        return contact;
    }

    public void setContact(String contact) {
        this.contact = contact;
    }

    @Override
    public String toString() {

        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-mm-dd"); //将Date日期转化为String字符串打印出来

        return "Student{" +
                "num='" + num + '\'' +
                ", name='" + name + '\'' +
                ", sex=" + sex +
                ", birthday=" + sdf.format(birthday) +
                ", contact='" + contact + '\'' +
                '}';
    }

}

(2)JavaTest.java:(给学生类赋值并打印出来)
package com.mbl.main;

import java.util.Calendar;
import java.util.Date;

import com.mbl.entity.Student;

public class StudentMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Student s = new Student();
        s.setNum("111222");
        s.setName("在奋斗的大道上");
        s.setSex('男');  //这里面赋值可以用中文
        s.setContact("zhouzhiwengang@163.com");

        Calendar calendar = Calendar.getInstance();
        calendar.set(1991, 11, 28);
        Date date = calendar.getTime();
        s.setBirthday(date);

        System.out.println(s.toString());
	}	

}

运行结果:


五、算法的设计目标:

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)) 为算法的渐进时间复杂度,简称时间复杂度。看下图便知:

情况一: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
     }
   }
 }
  上方代码中:
例2 :设n为如下算法处理的数据元素个数,求算法时间复杂度。代码如下:

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

分析:

01e98af6-e6c6-47f2-ab2d-d285baf389de

例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、时间复杂度的大小关系:

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

5defd8ca-9d0d-45f7-a85f-5b1aed4d8e04

指数时间的关系为:

ba087e1f-ca41-498a-8b68-be21acc22dca

当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)





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构Java实现01----算法概述 的相关文章

  • 测试产品说明书

    本篇文档是来自csdn 我觉得比较好 于是就收录了 尽管测试产品说明书不是所以软测人员都有机会去做 但还是值得一谈的 如果有幸在项目早期介入软件开发 并有一定的话语权的话 就相当有用了 在软件开发初始阶段发现软件缺陷将可能为项目节省大笔的开
  • 数据结构:队列Queue详解

    文章目录 一 队列的概念和特点 二 队列的使用 三 队列的简单实现 四 循环队列 一 队列的概念和特点 队列 只允许在一端进行插入数据操作 在另一端进行删除数据操作的特殊线性表 进行插入操作的一端称为队尾 删除操作的一端称队头 入队列 进行
  • 管理系统的设计与实现方法总结

    项目总结 1 项目开发背景 目前 国内外毕业论文选题一般采用两种方式 一种将毕业设计存在软盘上交 另一种则存放到教师的电脑上的一个共享目录内 但这两种方法都有各自的弊端 前一种方法不方便携带 速度慢 容量小 易损坏 后一种方法虽然解决了软盘
  • 关于互联网思维与技术团队的一些总结

    2017 7 4更 真正在底层工作的人员 跟站在高层的人看到的东西都是两个东西 真正的从底层走到高层才能看的更精准 同样的 从底层走到高层的人 也没有一直处在高层的远见与见识 我信奉公司处于什么阶段用什么样的人 没必要一开始就弄高精尖的人和
  • 基于Docker的Hadoop集群搭建

    基于Docker的Hadoop集群搭建 本文为在阿里云服务器上基于docker的Hadoop集群搭建 安装思路为 安装docker gt 运行docker导入ubuntu镜像 gt 运行ubuntu系统 gt 在系统中配置好单个节点 gt
  • FreeMarker整合Spring 3

    开发环境 System Windows WebBrowser IE6 Firefox3 JavaEE Server tomcat5 0 2 8 tomcat6 IDE eclipse MyEclipse 8 开发依赖库 JavaEE5 Sp

随机推荐

  • [QT编程系列-9]:C++图形用户界面编程,QT框架快速入门培训 - 3- QT窗体设计 - 自动布局

    目录 3 QT窗体设计 3 7 自动布局 3 7 1 自动布局 3 7 2 在主窗口中自动布局 3 7 3 在自动布局容器中自动布局 3 7 4 在widget中自动布局 3 7 5 自动布局工件 3 QT窗体设计 3 7 自动布局 3 7
  • 基于单片机火灾报警器仿真设计

    一 系统方案 1 本设计采用51单片机作为主控器 2 DS18B20采集温度值送到液晶1602显示 3 MQ2采集烟雾值 送到液晶1602显示 4 按键设置温度报警值 大于报警值 声光报警 二 硬件设计 原理图如下 三 单片机软件设计 1
  • qt ×掉子窗口后,进程还没有停止的问题

    掉子窗口后 子窗口还在接受数据的问题 当子窗口显示时 先关闭父窗口 调用的先后顺序为 当子窗口显示时 先关闭子窗口 调用的先后顺序为 找到原因 此时子窗口的析构函数没有执行 解决方案 先说解决方案 给子窗口设置以下属性 setAttribu
  • UE4 去掉自动曝光(光线自适应)

    UE4在没有PostprocessingVolumn时 会在场景中加入自动曝光 有时会导致过亮或者过暗 解决方法 关闭ProjectSetting Rendering DefaultSetting中的AutoExposure 自动曝光 在场
  • CentOS安装错误:no default or ui configuration

    靠 以后再也不用浏览器自带的下载工具下载镜像文件了 原来是下载的不完整 但是显示完全下载完毕了 真特么误导人 文件的checksum不对 references https www centos org forums viewtopic ph
  • c++11 pod类型(了解)

    c 11 pod类型 了解 啥是POD类型 POD全称Plain Old Data 通俗的讲 一个类或结构体通过二进制拷贝后还能保持其数据不变 那么它就是一个POD类型 平凡的定义 1 有平凡的构造函数 2 有平凡的拷贝构造函数 3 有平凡
  • ReactHook EffectHook

    副作用操作 使得函数组件能够进行生命周期的操作 可以有多个 类组件中相同的生命周期会进行覆盖 会在 可以看作是以下生命周期函数的结合 componentDidMount componentDidUpdate 和 componentWillU
  • MR应用开发 —— Hadoop权威指南10

    1 Configuration Hadoop的配置API 之前 在获取Hadoop文件实例时 经常会创建一个Configuration实例 Configuration是Hadoop用于配置的API 是property和value的集合 ad
  • centos系统elasticseach安装

    Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎 一个建立在全文搜索引擎 Apache Lucene 基础上的搜索引擎 当然 Elasticsearch 并不仅仅是 Lucene 那么简单 它不仅包括了全文搜索功能 还可以
  • Python堆积条形图、双轴图、多子图、圆圈热力图示例

    准备工作 使用Python绘图首先需要导入需要的库 并确保中文和负号的正常显示 import os import xlrd import pandas as pd import numpy as np import matplotlib p
  • 了解在Linux系统下不同Shell介绍以及切换

    了解在Linux系统下不同Shell介绍以及切换 引言 在Linux系统中 Shell是用户与操作系统内核之间的接口 它是一个命令行解释器 用于执行用户输入的命令并与操作系统进行交互 在Linux中 常见的Shell包括zsh bash f
  • 用js实现二分查找法

    二分查找法 二分查找也称折半查找 Binary Search 它是一种效率较高的查找方法 但是 折半查找要求线性表必须采用顺序存储结构 而且表中元素按关键字有序排列 function binarySearch arr target let
  • Leetcode错题本1-实现一个 atoi 函数,使其能将字符串转换成整数。

    题目描述 请你来实现一个 atoi 函数 使其能将字符串转换成整数 首先 该函数会根据需要丢弃无用的开头空格字符 直到寻找到第一个非空格的字符为止 接下来的转化规则如下 如果第一个非空字符为正或者负号时 则将该符号与之后面尽可能多的连续数字
  • 【已解决】微信小程序调用方法说找不到 undefined

    问题 在另一个方法里面调用方法报错 说方法找不到 那大多数人都会意识到是this指针的问题 但是我明明加了es6语法 应该可以获取到this的啊 整个世界都迷幻了 桥豆麻袋 找到问题了 this指针的操作要在函数一开始就操作 很明显我下面调
  • 2023年最常见中高级Android面试题全解析,看完碾压面试官!!!

    最近正值秋招 一直在给公司招聘Android程序员 我从 2015 年做 TeamLeader 开始就习惯性的收集平时遇到的 Android技术问题或周围朋友见过的面试题 经过不断筛选 终于凝练成一套实用的小题库 题库中所有的问题请看下文
  • 抽象方法与抽象类 --笔记

    抽象方法 只有方法名 参数表和返回值 没有方法体 既然抽象方法没有方法体 那么也就不能被执行 如果某个类含有抽象方法 那么这个类必须定义为抽象类 即在类定义前用关键字abstract修饰 但需要注意 一个抽象类可以没有抽象方法 抽象类没有具
  • 数据密集型应用系统设计(1)

    文章目录 可靠 可拓展可维护的应用系统 软件系统最重要的三个特征 可靠性 可扩展性 可维护性 小结 可靠 可拓展可维护的应用系统 软件系统最重要的三个特征 可靠性 即使发生了某些错误 系统也可继续正常工作 故障 faults 或者叫错误 与
  • 正则表达式的验证

    java正则表达式通过java util regex包下的Pattern类与Matcher类实现 建议在阅读本文时 打开java API文档 当介绍到哪个方法时 查看java API中的方法说明 效果会更佳 Pattern类用于创建一个正则
  • 关于gd32f103的adc的一点说法

    最近使用gd32替换了stm32 但是在移植adc程序的时候出现了一些问题 这里进行一下总结 是给自己一个提醒 同时也是给后来人一点点参考 gd32f103是与stm32管脚一一对应的一款国产单片机 在性能上更为优越 价格上更加便宜 但是在
  • 数据结构Java实现01----算法概述

    本文转载至 http www cnblogs com smyhvae p 4724692 html 一 数据结构涵盖的内容 二 算法的基本概念 1 算法的概念 Algorithm 是对特定问题求解步骤的一种描述 它是指令的有限序列 其中每一