黑马程序员Java数据结构与java算法笔记(1)

news2024/9/23 21:32:49

数据结构和算法详细内容

来源:黑马程序员Java数据结构与java算法

1.数据结构和算法概述

1.1什么是数据结构?

数据结构就是把数据元素按照一定的关系组织起来的集合,用来组织和存储数据

1.2数据结构分类

传统上,我们可以把数据结构分为逻辑结构和物理结构两大类。

逻辑结构分类:

逻辑结构是从具体问题中抽象出来的模型,是抽象意义上的结构,按照对象中数据元素之间的相互关系分类
**a.集合结构:**集合结构中数据元素除了属于同一个集合外,他们之间没有任何其他的关系。
在这里插入图片描述
**b.线性结构:**线性结构中的数据元素之间存在一对一的关系
在这里插入图片描述
**c.树形结构:**树形结构中的数据元素之间存在一对多的层次关系
在这里插入图片描述

**d.图形结构:**图形结构的数据元素是多对多的关系

在这里插入图片描述

物理结构分类:

逻辑结构在计算机中真正的表示方式(又称为映像)称为物理结构,也可以叫做存储结构。常见的物理结构有顺序
存储结构、链式存储结构

顺序存储结构:

把数据元素放到地址连续的存储单元里面,其数据间的逻辑关系和物理关系是一致的 ,比如我们常用的数组就是
顺序存储结构。
在这里插入图片描述
顺序存储结构存在一定的弊端,就像生活中排时也会有人插队也可能有人有特殊情况突然离开,这时候整个结构都
处于变化中,此时就需要链式存储结构。

链式存储结构:

是把数据元素存放在任意的存储单元里面,这组存储单元可以是连续的也可以是不连续的。此时,数据元素之间并
不能反映元素间的逻辑关系,因此在链式存储结构中引进了一个指针存放数据元素的地址,这样通过地址就可以找
到相关联数据元素的位置

在这里插入图片描述

1.3 算法是什么?

根据一定的条件,对一些数据进行计算,得到需要的结果。

一个优秀的算法追求以下两个目标:
1.花最少的时间完成需求;
2.占用最少的内存空间完成需求;

2.算法分析

1.1算法的时间复杂度分析

在计算机程序编写前,依据统计方法对算法进行估算,经过总结,我们发现一个高级语言编写的程序程序在计算机
上运行所消耗的时间取决于下列因素:
1.算法采用的策略和方案;
2.编译产生的代码质量;
3.问题的输入规模(所谓的问题输入规模就是输入量的多少);
4.机器执行指令的速度;

需求:
计算1到100的和。

第一种解法:

//如果输入量为n为1,则需要计算1次;
//如果输入量n为1亿,则需要计算1亿次;
public static void main(String[] args) {
	int sum = 0;//执行1次
	int n=100;//执行1次
	for (int i = 1; i <= n; i++) {//执行了n+1次
	sum += i;//执行了n次
}
System.out.println("sum=" + sum);
}

第二种解法:

//如果输入量为n为1,则需要计算1次;
//如果输入量n为1亿,则需要计算1次;
public static void main(String[] args) {
	int sum = 0;//执行1次
	int n=100;//执行1次
	sum = (n+1)*n/2;//执行1次
	System.out.println("sum="+sum);
}

因此,当输入规模为n时,第一种算法执行了1+1+(n+1)+n=2n+3次;第二种算法执行了1+1+1=3次。如果我们把
第一种算法的循环体看做是一个整体,忽略结束条件的判断,那么其实这两个算法运行时间的差距就是n和1的差
距。
为什么循环判断在算法1里执行了n+1次,看起来是个不小的数量,但是却可以忽略呢?我们来看下一个例子:
需求:
计算100个1+100个2+100个3+…100个100的结果
代码:

public static void main(String[] args) {
	int sum=0;
	int n=100;
	for (int i = 1; i <=n ; i++) {
	for (int j = 1; j <=n ; j++) {
	sum+=i;
	}
}
System.out.println("sum="+sum);
}

在这里插入图片描述
函数渐近增长
给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么我们说f(n)的增长渐近
快于g(n)。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.2 算法的时间复杂度

定义:

在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况并确定T(n)的
量级。算法的时间复杂度,就是算法的时间量度,记作:T(n)=O(f(n))。它表示随着问题规模n的增大,算法执行时间
的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度,其中f(n)是问题规模n的某个函数。
在这里,我们需要明确一个事情:执行次数=执行时间

用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。一般情况下,随着输入规模n的增大,T(n)增长最
慢的算法为最优算法。
下面我们使用大O表示法来表示一些求和算法的时间复杂度:

在这里插入图片描述
在这里插入图片描述

1.3常见的大O阶

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.4 函数调用的时间复杂度分析

在这里插入图片描述
在这里插入图片描述

1.4.1最坏情况

例:

public int search(int num){
int[] arr={11,10,8,9,7,22,23,0};
for (int i = 0; i < arr.length; i++) {
if (num==arr[i]){
return i;
}
}
return -1;
}

最好情况:
查找的第一个数字就是期望的数字,那么算法的时间复杂度为O(1)
最坏情况:
查找的最后一个数字,才是期望的数字,那么算法的时间复杂度为O(n)
平均情况:
任何数字查找的平均成本是O(n/2)
最坏情况是一种保证,在应用中,这是一种最基本的保障,即使在最坏情况下,也能够正常提供服务,所以,除非特别指定,我们提到的运行时间都指的是最坏情况下的运行时间。

1.5 空间复杂度分析

算法的空间复杂度计算公式记作:S(n)=O(f(n)),其中n为输入规模,f(n)为语句关于n所占存储空间的函数。

案例:
对指定的数组元素进行反转,并返回反转的内容。

解法一:

public static int[] reverse1(int[] arr){
int n=arr.length;//申请4个字节
int temp;//申请4个字节
for(int start=0,end=n-1;start<=end;start++,end--){
temp=arr[start];
arr[start]=arr[end];
arr[end]=temp;
}
return arr;
}

解法二:

public static int[] reverse2(int[] arr){
int n=arr.length;//申请4个字节
int[] temp=new int[n];//申请n*4个字节+数组自身头信息开销24个字节
for (int i = n-1; i >=0; i--) {
temp[n-1-i]=arr[i];
}
return temp;
}

忽略判断条件占用的内存,我们得出的内存占用情况如下:
算法一:
不管传入的数组大小为多少,始终额外申请4+4=8个字节;
算法二:
4+4n+24=4n+28;
根据大O推导法则,算法一的空间复杂度为O(1),算法二的空间复杂度为O(n),所以从空间占用的角度讲,算法一要优于算法二
由于java中有内存垃圾回收机制,并且jvm对程序的内存占用也有优化(例如即时编译),我们无法精确的评估一个java程序的内存占用情况,但是了解了java的基本内存占用,使我们可以对java程序的内存占用情况进行估算。
由于现在的计算机设备内存一般都比较大,基本上个人计算机都是4G起步,大的可以达到32G,所以内存占用一般情况下并不是我们算法的瓶颈,普通情况下直接说复杂度,默认为算法的时间复杂度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跟我学Python图像处理丨图像分类原理与案例

摘要&#xff1a;本篇文章将分享图像分类原理&#xff0c;并介绍基于KNN、朴素贝叶斯算法的图像分类案例。本文分享自华为云社区《[Python图像处理] 二十六.图像分类原理及基于KNN、朴素贝叶斯算法的图像分类案例丨【百变AI秀】》&#xff0c;作者&#xff1a;eastmount 。 一…

5-4:发送系统通知

触发事件 评论后&#xff0c;发布通知点赞后&#xff0c;发布通知关注后&#xff0c;发布通知。 处理事件 封装事件对象开发事件的生产者开发事件的消费者 消费者线程&#xff1a;从队列里读消息&#xff0c;并做处理&#xff1b; 生产者线程&#xff1a;往线程中存入数据&…

深度神经网络是什么意思,神经网络准确度只有50

1、研究人工神经网络的权值分布有什么意义 神经网络一般都是非常庞大的&#xff0c;每个边对应一个权值&#xff0c;如果权值不共享的话&#xff0c;数据量就更大了&#xff0c;但是为了提高效率&#xff0c;引入了权值共享&#xff0c;但是还不够&#xff0c;想再次提高效率和…

五、伊森商城 前端基础-Vue Vue脚手架创建 p26

目录 一、vue 模块化开发 1、全局安装 webpack 2、全局安装 vue 脚手架vue-cli 3、初始化 vue 项目 3.1、创建文件夹 3.2、初始化vue脚手架 3.3、项目结构 4、项目启动命令 拓展&#xff1a;创建超时 一、vue 模块化开发 打开终端&#xff0c;进行命令安装 1、全局安装…

Linux网络基础(初级)

Linux网络基础 文章目录Linux网络基础1.计算机网络的发展过程1.1 独立模式1.2 网络互联模式1.3 局域网 LAN1.4 广域网 WAN2.计算机网络协议2.1 协议的概念2.2 什么是网络协议2.3 什么是网络协议簇2.4 OSI 七层模型2.5 TCP/IP 五层模型3.网络传输基本流程3.1 同局域网内的两台主…

[附源码]计算机毕业设计拉勾教育课程管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

实例解析丨一文搞定GaussDB CM服务异常

摘要&#xff1a;本文主要为大家带来如何处理GaussDB CM服务异常问题。本文分享自华为云社区《【实例状态】GaussDB CM服务异常》&#xff0c;作者&#xff1a;酷哥。 首先确认是否是虚拟机、网络故障&#xff0c;底层故障处理 PID文件未清理导致进程启动失败 问题现象 收到…

FS2115D SOT23-6 低噪声3.3V升压IC电荷泵 DC/DC 转换器

概述 FS2115D 是一款低噪声、恒定频率 &#xff08;1.2MHz&#xff09; 开关电容倍压器。它从 1.8V 至 5V 输入产生一个稳定的输出电压&#xff0c;输出电流高达 150mA。FS2115D 的外部元件数量少&#xff08;VIN 和 VOUT 处有一个跨接电容器和两个小型旁路电容器&#xff09;…

程序员看世界杯

目录 1、世界杯赛事规则 1.1、赛制 1.2、小组赛 1.3、淘汰赛阶段 1.4、1/8决赛 1.5、半决赛 1.6、决赛 2、大力神杯材质 3、看球心德 4、2022大力神杯赢家 1、世界杯赛事规则 1.1、赛制 世界杯一共进行64场&#xff0c;其中分小组赛48场&#xff0c;1/8决赛8场&am…

Sentinel--服务容错

目录一、高并发带来的问题二、服务雪崩效应三、常见容错方案四、Sentinel入门什么是Sentinel安装Sentinel控制台实现一个接口的限流五、Sentinel的概念和功能基本概念重要功能六、Sentinel规则流控规则简单配置配置流控模式配置流控效果降级规则热点规则授权规则系统规则自定义…

行为管理(锐捷行业网关篇)

大家好&#xff0c;我是小杜。有了自学习和师傅指导这个“buff”&#xff0c;感觉自己的进步是“一日千里”啊&#xff01; 今天来学习网关产品的行为管理相关的配置&#xff0c;咦&#xff0c;网关EG系列和睿易的NBR-E系列的路由器差不多啊&#xff0c;难道是“双胞胎”&#…

安卓app源码和设计报告——简易记账本

课 程 设 计&#xff08;实训&#xff09;说 明 书 题目实现简易记账本功能 专 业班 级学生姓名同组学生指导老师课程设计&#xff08;实训&#xff09;评语 学生姓名 专业 班级 2 题目 实现简易记账本功能 评语&#xff1a; 成绩&#xff1a; 优良中及格不及格出勤20%实…

ArrayList、LinkedList、HashMap

ArrayList 特点&#xff1a;元素有放入顺序&#xff0c;元素可重复 存储结构&#xff1a;底层采用数组来实现的,数组在内存中是需要连续的存储单元的 public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, ja…

计数问题

目录 B.计数问题 思路: 代码: 时间复杂度: 总结: 题目链接: B.计数问题 时间&#xff1a;1s 空间&#xff1a;128M 题目描述&#xff1a; 计算在区间 1 到 n 的所有整数中&#xff0c;数字 x(0 ≤ x ≤ 9)共出现了多少次&#xff1f;例如&#xff0c;在 1到 11中&…

阿里P9大牛整理总结出进阶架构师必备知识:NginxLua开发实战文档

前言 有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台…

基于遗传算法和非线性规划的函数寻优算法(Matlab代码实现)

目录 1 概述 1.1简介 1.2 遗传算法及其基本步骤 2 部分运行结果 3 Matlab代码实现 4 参考文献 1 概述 1.1简介 现实生活中很多科学计算和工程问题都可以通过建模转化成求函数的优化问题&#xff0c;并求出函数模型在可行域内的最优解&#xff0c;给决策者提供参考。非线…

【AI学习笔记】Error: ffmpeg error (see stderr output for detail)

报错&#xff1a; 原因&#xff1a; 我询问了一下大佬&#xff0c;大佬说让我调试一下ffmpeg库&#xff0c;看本地能不能用&#xff0c;然后又结合了我查看的一些博文及本地环境&#xff0c;推论出我很可能没有配置环境。 由于我conda一个环境&#xff0c;本地一个python3.9环…

Vue按钮(Button)

可自定义设置以下属性&#xff1a; 按钮默认文本&#xff08;name&#xff09;,默认不设置时显示为按钮 按钮类型&#xff08;type&#xff09;&#xff0c;默认default&#xff0c;另外可选primary danger 按钮悬浮变化效果&#xff08;effect&#xff09;&#xff0c;只有t…

TokenFusion 代码

只看语义分割。 # --------------------------------------------------------------- # Copyright (c) 2021, NVIDIA Corporation. All rights reserved. # # This work is licensed under the NVIDIA Source Code License # ----------------------------------------------…

UNIAPP实战项目笔记48 确认支付页面的布局

UNIAPP实战项目笔记48 确认支付页面的布局 实际案例图片 显示确认支付页面布局 具体内容图片自己替换哈&#xff0c;随便找了个图片的做示例 具体位置见目录结构 完善布局页面和样式 代码 payment.vue部分 payment.vue 确认订单页面布局和渲染 <template><view>…