JavaSE学习笔记 Day20

JavaSE学习笔记 Day20

个人整理非商业用途,欢迎探讨与指正!!
« 上一篇


文章目录

  • JavaSE学习笔记 Day20
    • ···
    • 十七、数据结构与算法
      • 17.1算法
        • 17.1.1冒泡排序
        • 17.1.2选择排序
        • 17.1.3插入排序
        • 17.1.4三个排序的区别
      • 17.2顺序表
        • 17.2.1顺序表代码实现
        • 17.2.2顺序表的问题
        • 17.2.3顺序表的扩容问题解决
      • 17.3链表
        • 17.3.1链表的代码实现
      • 17.4树
        • 17.4.1树的相关名称
        • 17.4.2树的分类
        • 17.4.3二叉树


···

十七、数据结构与算法

排序算法,线型结构,树型结构,图…

17.1算法

在计算机中实现数学公式或者数学逻辑

17.1.1冒泡排序

相邻的两个数进行比较,大的向后,反复这样的操作

public class Demo01 {

//	编写冒泡排序算法的方法
	public static int[] range(int ...args) {
		for(int i = 0;i<args.length - 1;i++) {
			for(int j = 0;j<args.length - 1 - i;j++) {
//				两个数进行比较,大的数值向后
				if(args[j] > args[j + 1]) {
					int temp = args[j];
					args[j] = args[j+1];
					args[j+1] = temp;
				}
			}
		}
		return args;
	}
	
	public static void main(String[] args) {
		int[] range = range(10,20,31,14,200,30);
		for (int i : range) {
			System.out.println(i);
		}
	}
}
17.1.2选择排序

算法描述
 在未排序的序列中找到一个最大(小),存放到需要排序的序列最开始的位置
 然后再从剩余的未排序的元素中继续寻找最大(小),然后排放到已排序的末尾
 以此类推,直到所有元素都排序完毕

//	1.从未排序的数组中找到最小值
public class Test01 {

	public static void main(String[] args) {
//		定义未排序的数组
		int[] arr = {1,4,123,5,3,1235,5,2,4};
//		遍历数组找到最小的元素
//		假定最小的元素为 第0个位置
		int minValue = arr[0];
		
//		通过循环判断出真实的最小值
		for(int i = 0;i<arr.length;i++) {
//			所有位置都和最小值去比较
			if(arr[i] < minValue) {
//				更新最小值
				minValue = arr[i];
			}
		}		
		System.out.println("最小值为:"+minValue);
	}
}
//	2.将最小值和没有排序的数组的一个元素进行交换
public class Test02 {
	public static void main(String[] args) {
//		定义未排序的数组
		int[] arr = {4,123,5,3,1235,5,2,4,1};
//		遍历数组找到最小的元素

//		定义一个下标,获取到最小的下标
		int minPosition = 0;
		
//		通过循环判断出真实的最小值
		for(int i = 0;i<arr.length;i++) {
//			所有位置都和最小值去比较
			if(arr[i] < arr[minPosition]) {
//				获取最小值的下标
				minPosition = i;
			}
		}
		
		System.out.println("最小值为:"+arr[minPosition]);
		System.out.println("最小值的下标:"+minPosition);
		
//		将最小值更换到0的位置
		int temp = arr[0];
		arr[0] = arr[minPosition];
		arr[minPosition] = temp;
		
		System.out.println(Arrays.toString(arr));
	}
}
//	3.将未排序的数组,重复的进行1和2步
public class Test03 {

	public static void main(String[] args) {
		int[] arr = {4,123,5,3,1235,5,2,4,1};
//		定义循环变量
		int start = 0;
		int minPosition = start;
		
		for(int i = start;i<arr.length;i++) {
			if(arr[i] < arr[minPosition]) {
				minPosition = i;
			}
		}
		
		System.out.println("最小值为:"+arr[minPosition]);
		System.out.println("最小值的下标:"+minPosition);
		
		int temp = arr[start];
		arr[start] = arr[minPosition];
		arr[minPosition] = temp;
		
		System.out.println(Arrays.toString(arr));
		
//		重复的执行start = 1 start = 2 ... 时的变化
    }
}
//	4.使用循环去完成整个算法的优化
//	将未排序的数组,重复的进行1和2步
public class Test04 {
	public static int[] range(int ...arr) {
        //start不是随意的,start表示的是下标
		for(int start = 0;start < arr.length;start ++) {
			int minPosition = start;
			for(int i = start;i<arr.length;i++) {
				if(arr[i] < arr[minPosition]) {
					minPosition = i;
				}
			}
			int temp = arr[start];
			arr[start] = arr[minPosition];
			arr[minPosition] = temp;
		}
		return arr;
	}

	public static void main(String[] args) {
		int[] arr = {4,123,5,3,1235,5,2,4,1};
		arr = range(arr);
		System.out.println(Arrays.toString(arr));
	}
}
17.1.3插入排序

算法描述:
 1.从第一个元素开始,该元素被认定为已经排序
 2.取出下一个数,在已经排序的元素序列从后向前扫描
 3.若该元素(已排序的)大于新元素,该元素向下移位
 4.重复第3步,直到找到已排序的元素小于或者等于新的元素位置
 5.将新的元素插入到该位置
 6.重复2-5

public class Test02 {

//	1.从没有排序的数组中取出一个元素,和已排序的数组中的内容进行比较,小的向前
	public static void main(String[] args) {
		int[] arr = {8,6,4,7,44,3,21};
//		认为arr[0]是有序的
//		取出一个值
		int insert = arr[1];
//		判断大小
		if(arr[0] > insert) {
//			若大则向后
			arr[1] = arr[0];
		}
		
//		安排取出来的值
		arr[0] = insert;
		
		System.out.println(Arrays.toString(arr));
		
//		0 1有序
//		取一个值
		insert = arr[2];
		if(arr[1] > insert) {
//			大的值向后
			arr[2] = arr[1];
		}
		if(arr[0] > insert) {
//			大的值向后
			arr[1] = arr[0];
		}
//		安排取出去的值
		arr[0] = insert;
		System.out.println(Arrays.toString(arr));
		
		insert = arr[3];
		
		if(arr[2] > insert) {
//			大的向后
			arr[3] = arr[2];
		}
		
		if(arr[1] > insert) {
//			大的向后
			arr[2] = arr[1];
		}else {
//			若不大,则插入到指定的位置
			arr[2] = insert;
		}
		System.out.println(Arrays.toString(arr));
		
		insert = arr[4];
		if(arr[3] > insert) {
			arr[4] = arr[3];
		}
		if(arr[2] > insert) {
			arr[3] = arr[2];
		}
		System.out.println(Arrays.toString(arr));
		insert = arr[5];
		if(arr[4] > insert) {
			arr[5] = arr[4];
		}
		if(arr[3] > insert) {
			arr[4] = arr[3];
		}
		if(arr[2] > insert) {
			arr[3] = arr[2];
		}
		if(arr[1] > insert) {
			arr[2] = arr[1];
		}
		if(arr[0] > insert) {
			arr[1] = arr[0];
		}
		arr[0] = insert;
		System.out.println(Arrays.toString(arr));
		insert = arr[6];
		if(arr[5] > insert) {
			arr[6] = arr[5];
		}
		if(arr[4] > insert) {
//			大的向后
			arr[5] = arr[4];
		}else {
//			不大说明到地方了
			arr[5] = insert;
		}
		System.out.println(Arrays.toString(arr));
	}
}
public class Test04 {
	public static int[] range(int ...arr) {
		for(int index = 1;index<arr.length;index++) {
			int insert = arr[index];
			while(index > 0) {
				if(arr[index-1] > insert) {
					arr[index] = arr[index - 1];
				}else {
					arr[index] = insert;
					break;
				}
				index --;
				if(index == 0) {
					arr[0] = insert;
				}
			}
		}
		return arr;
	}
	public static void main(String[] args) {
		int[] arr = {8,6,4,7,44,3,21,-1};
		arr = range(arr);
		System.out.println(Arrays.toString(arr));
	}
}
17.1.4三个排序的区别

冒选插都使用了循环,并且基本上都是遍历所有的元素,时间复杂度都是O(N^2)
有一些细微的差别
 冒泡,书写最简单的,但是性能没有另外两个好,比较次数和轮数是最多的
 选择,比较次数比较多,但是交换次数少
 插入,交换的次数多,但是比较次数会相对少一些

17.2顺序表

内存中以数组的形式,保存的一种数据结构,使用一连串的内存地址线性的存储数据的

17.2.1顺序表代码实现
public class MyArrayList<T> {

//	存储的元素
	private T[] items;
//	存储数据的有效数值
	private int size;
//	添加构造方法
	public MyArrayList(int capacity) {
//		capacity容量
	}
//	获取当前集合的元素个数
	public int size() {
		return size;
	}
	
//	添加到数组 添加到数组的尾部
	public void add(T t) {
//		设计扩容方法
	}
//	返回指定下标的元素
	public T get(int i) {
		return items[i];
	}
//	移除
	public T remove(int i) {
//		下标是否合法
//		将后面的内容向前移动
//		将最后一个位置设置为null
		return items[i];
	}
}
17.2.2顺序表的问题

扩容问题,数组的长度的是固定的,没有空间时就会抛出数组下标越界异常
 ArrayIndexOutOfBoundsException

17.2.3顺序表的扩容问题解决

1.自定义扩容算法
2.System的arrayCopy(原数组,原数组拷贝的下标,新数组,新数组拷贝的下标,拷贝的长度)
3.Arrays的copyOf(原数组,新数组的长度)底层调用的是System的arrayCopy

17.3链表

顺序表,内存连续,查询快,删除修改慢
链表是概念上逻辑上的连续,内存中并不连续,物理地址中存放是不连续的,无顺序的
插入和删除修改性能特别高
查询效率低

17.3.1链表的代码实现

链表不是使用数组实现的,而是通过节点实现的

//	单链表
public class Node<T> {

	T item;//存储当前节点元素
	Node next;//下一元素
	
	public Node(T item,Node next){
		this.item = item;
		this.next = next;
	}
}
//	双链表
public class Node2<T> {

	Node2<T> pre;//上一个
	T item;//当前的
	Node2<T> next;//下一个
	
	public Node2(Node2<T> pre,T item,Node2<T> next) {
		this.pre = pre;
		this.item = item;
		this.next = next;
	}
	
	public static void main(String[] args) {
//		就是双链表中的唯一数据
		Node2<String> n1 = new Node2<String>(null, "helloworld", null);
		
		Node2<String> n2 = new Node2<String>(n1, "嘿嘿", null);
		
		Node2<String> n3 = new Node2<String>(n2, "嘎嘎", null);
	}
}

17.4树

树这种数据结构可以同时提高存储和检索的效率
数的特征:
 1.数由n个有限节点组成一个有层次关系的集合
 2.每个节点都有0个或多个子节点
 3.没有父节点的成为根节点
 4.每个非根节点,只有一个父节点
 5.除了根节点以外,每个子节点都可以分为多个不相交的子树

17.4.1树的相关名称

节点:树中存储数据的对象
根节点:树中唯一没有父节点的节点
父节点:节点的上一层节点,每个节点最多只有一个父节点
子节点:节点的下一层节点,每个节点可以有多个子节点或者没有
叶子节点:没有子节点的节点
节点的度:节点的子节点数量
树的度:一颗树中,最大节点的度称为树的度
路径:从根节点到当前节点的路径
节点的层:从根节点开始,根节点为1层,下一层为2层,以此类推
高度:数的最大层
森林:有n棵不相交的树的组成的集合称为森林,若一棵树根节点删除,那么会变成一个森林

17.4.2树的分类

二叉树:
 每个父节点只有两个子节点
 查找数:
  平衡树和红黑树
 带权树:
   最优二叉数
多叉数:
 每个父节点超过两个子节点
 B_树,B+树

17.4.3二叉树

二叉树的度:2
 满二叉树:每个节点都是饱和状态
 完全二叉树:最后一层的节点数,从左向右是连续的(满二叉树是完全二叉树的天特殊情况)
树的遍历
 将所有的节点都访问一次,只有一次
 前序遍历:根左右
 中序遍历:左根右
 后序遍历:左右根

前序/先序:1 245 367
中序:425 1 637
后序:452 673 1

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaEE:线程池精讲

目录 一.什么是线程池 二.线程池的实现原理 &#x1f388;为什么要有工厂模式&#xff1f; 三.线程池的构造方法解读 &#x1f388;线程池的拒绝策略 四.自己实现一个线程池 一.什么是线程池 简单来说&#xff0c;线程池就好比一块鱼塘&#xff0c;鱼塘中的每条鱼就是一个线程…

HackTheBox - Medium - Windows - Authority

Authority 终于把easy的机器刷的八八九九了&#xff0c;开始新一轮的Medium机器&#xff0c;Medium难度以上的我都会写wp&#xff0c;保持学习&#xff0c;我的CRTO进度也快结束了。 Authority是一台中等难度的 Windows 计算机&#xff0c;它强调了错误配置、密码重用、在共享…

2023 英特尔On技术创新大会直播 |让更多人了解AI魅力

2023 英特尔On技术创新大会直播 |让更多人了解AI魅力 前言&#xff1a;主要领域:人工智能&#xff1a;使用 OpenVINO™ 落地边缘端生成式 AIOpenVINO™学习总结&#xff1a; 新一代 AI PC计算平台&#xff1a;新一代至强平台&#xff1a;边云协同&#xff1a;先进技术&#xff…

深入探索Git的高级技巧与神奇操作(分支,高效合并)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 深入探索Git的高级技巧与神奇操作 前言强制推送的妙用1. 什么是强制推送&#xff1f;2. 为什么需要使用强制推送&#xff1f;3. 强制推送的风险与注意事项4. 如何正确、安全地执行强制推送步骤&#x…

JDK21+HADOOP3.2.2+Windows安装步骤

哈哈哈 最近转战大数据这块了&#xff0c;分享一下hadoop3.2.2的安装步骤 借鉴了不少大佬的文章&#xff0c;如有雷同&#xff0c;都是大佬们的 1.JDK安装 我选择的是JDK21 以下是下载网址和截图&#xff0c;这个没有太多的&#xff0c;一般下载最新的就可以 JDK: Java Down…

Golang学习之路一一Hello, World

Golang学习之路一一Hello, World golang工作目录下src下新建一个项目demo,如图: 在demo下新建hello_world.go文件,内容如下: package main //声明本文件的package名import "fmt" //import语言的fmt库——---用于输出func main() {fmt.Println("Hello, World!&…

【2.2操作系统】进程管理

目录 1.进程的基本概念2.进程的状态3.信号量与PV操作4.前趋图5.死锁6.银行家算法 1.进程的基本概念 &#x1f31f;进程是程序在一个数据集合上运行的过程&#xff0c;它是系统进行资源分配和调度的一个独立单位。它由程序块、进程控制块 (PCB) 和数据块三部分组成。 &#x1f…

一款视频行为分析系统,可轻松开发安全行为检测

系列版本介绍 基于视频行为分析系统v4系列版本可以在不用考虑流媒体音视频开发&#xff0c;编解码开发&#xff0c;界面开发等情况下&#xff0c; 只需要训练自己的模型&#xff0c;开发自己的行为算法插件&#xff0c;就可以轻松开发出任何你想要的安全行为检测&#xff0c;比…

浅谈云性能测试的关键要点

随着云计算的广泛应用&#xff0c;云性能测试成为确保云服务质量和性能的关键环节。云性能测试不仅涵盖了传统性能测试的方面&#xff0c;还需要考虑云环境的特殊性。以下是云性能测试的几个关键要点&#xff1a; 1. 模拟真实云环境 云环境具有虚拟化、弹性扩展等特点&#xff…

视频去水印怎么去掉?这三个去水印方法值得收藏

视频去水印怎么去掉&#xff1f;对于视频去水印&#xff0c;对于那些对去水印软件不是很熟悉的人来说&#xff0c;可能会感到有些困难。但是&#xff0c;不用担心&#xff0c;今天就来为大家介绍几种视频去水印软件和教你们视频去水印的详细步骤&#xff0c;让你们轻松去掉视频…

TOUGH系列软件实践技术应用

TOUGH系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH系列软件采用模块化设计和有限积分差网格剖分方法&#xff0c;通过配合不同状态方程&#xff08;EOS模…

whisper深入-语者分离

文章目录 学习目标&#xff1a;如何使用whisper学习内容一&#xff1a;whisper 转文字1.1 使用whisper.load_model()方法下载&#xff0c;加载1.2 使用实例对文件进行转录1.3 实战 学习内容二&#xff1a;语者分离&#xff08;pyannote.audio&#xff09;pyannote.audio是huggi…

选数C语言

分析&#xff1a;这个题目主要解决两个问题 1.将数字选出来&#xff0c;不能重复的选出k个数字&#xff0c;并且要对选出来的数字进行求和 2.对求和的数字进行判断是否为素数&#xff0c;如果是就统计一次&#xff0c;如果不是就不统计 1.如果我们想选两两为一组的数字&#…

ansible远程操作主机功能和自动化运维

ansible 两个功能&#xff1a;1、远程操作主机功能 2、自动化运维&#xff08;play 剧本 yaml&#xff09; 简述&#xff1a; 是基于python开发的配置管理和应用部署工具。在自动化运维中&#xff0c;现在是异军突起。 Asible能批量配置&#xff0c;部署&#xff0c;管理上千…

锐捷 | AP利用路由网络发现AC

//AP与交换机进行测试获取信息 how lldp neighbors detail //在DHCP服务器中查看是否将IP分配给了AP 注&#xff1a;若AP为静态IP地址&#xff0c;则该命令无法查看 show ip dhcp binding | inc 300d.9e86.a9xx (到底啦~~~)

LLM之RAG实战(六)| 高级RAG 02:选择最佳embedding和重排序模型

在构建检索增强生成&#xff08;RAG&#xff09;Pipeline时&#xff0c;一个关键组件是Retriever。我们有多种embedding模型可供选择&#xff0c;包括OpenAI、CohereAI和开源sentence transformers。此外&#xff0c;CohereAI和sentence transformers还提供了几个重排序器。 但…

探索Qt 6.3:了解基本知识点和新特性

学习目标&#xff1a; 理解Qt6.3的基本概念和框架&#xff1a;解释Qt是什么&#xff0c;它的核心思想和设计原则。学会安装和配置Qt6.3开发环境&#xff1a;提供详细的步骤&#xff0c;让读者能够顺利安装和配置Qt6.3的开发环境。掌握Qt6.3的基本编程技巧&#xff1a;介绍Qt6.…

python接口自动化测试--requests使用和基本方法封装

之前学习了使用jmeterant做接口测试&#xff0c;并实现了接口的批量维护管理(大概500多条用例)&#xff0c;对“接口”以及“接口测试”有了一个基础了解&#xff0c;最近找了一些用python做接口测试的资料&#xff0c;一方面为了学习下如何使用python进行接口测试(如何做出一个…

MSA【3】:SAMed

文章目录 前言1. Abstract & Introduction1.1. Abstract1.2. Introduction 2. Methods2.1. Overview2.2. LoRA in image encoder2.3. Prompt encoder and mask decoder2.4. Training strategies2.4.1. Loss function2.4.2. Warmup2.4.3. AdamW optimizer 总结 前言 SAMed …

青藤销售云助力企业数智化销售

青藤销售云助力企业数智化销售覆盖&#xff1a; 1.人工自动外呼群呼 2.AI电销销售机器人自动筛选意向客户 3.crm企业微信智能客户管理运行系统 4.电话回拨系统不限拨打频次高频外呼不封号 5.语音通知系统覆盖工单提醒、发货提醒、缴费提醒等场景 6.手机号外显专号专用高接通率线…