【数据结构】--ArrayList与顺序表
文章目录
- 1. 线性表
- 2. 顺序表
- 3. ArrayList简介
- 4. MyArrayList的实现
- 5. ArrayList使用
- 5.1 ArrayList的构造
- 5.2 ArrayList常见操作
- 5.3 ArrayList的遍历
- 5.4 ArrayList的扩容机制
- 6. ArrayList的具体使用
- 6.1 简单的洗牌算法
- 6.2 杨辉三角
1. 线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
2. 顺序表
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表的底层是一个数组。顺序表是一个新的类型,最终的操作确实是在操作数组,但是它是一个新的类型。
3. ArrayList简介
在集合框架中,ArrayList是一个普通的类,实现了List接口
【说明】
- ArrayList是以泛型方式实现的,使用时必须要先实例化
- ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问
- ArrayList实现了Cloneable接口,表明ArrayList是可以clone的
- ArrayList实现了Serializable接口,表明ArrayList是支持序列化的
- 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList
- ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表
4. MyArrayList的实现
MyArrayList类:
public class MyArrayList implements IList{public int[] elem;public int usedSize;//记录当前的有效数据个数public MyArrayList(){this.elem = new int[10];}/*** 把data放在数组中 有效数据的最后一个位置* @param data*/@Overridepublic void add(int data) {//如果数组满了--->扩容if (ifFull()){resize();}else {elem[usedSize] = data;usedSize++;}}//扩容数组private void resize(){//二倍扩容elem = Arrays.copyOf(elem,2*elem.length);}/*** 将数据data插入到指定的pos位置* @param pos* @param data*/@Overridepublic void add(int pos, int data) {//如果输入的下标不合理if(pos<0 || pos>usedSize){throw new PosOutOfException("pos位置不合法");}//判满if(ifFull()){//扩容resize();}//将pos位置及后面的元素整体向后挪动int i = usedSize-1;while(i>=pos){elem[i+1] = elem[i];i--;}elem[pos] = data;usedSize++;}/***判断数组中是否有数据toFind* @param toFind* @return*/@Overridepublic boolean contains(int toFind) {if (isEmpty()){return false;}for (int i = 0; i < usedSize; i++) {if (elem[i]==toFind){return true;}}return false;}/*** 找到数据toFind 并返回该数据的下标* @param toFind* @return*/@Overridepublic int indexOf(int toFind) {if (isEmpty()){return -1;}for (int i = 0; i < usedSize; i++) {if (elem[i]==toFind){return i;}}return -1;}/*** 获取pos下标的数据* @param pos* @return*/@Overridepublic int get(int pos) {//考虑pos的合法性if(pos<0 || pos>=usedSize){throw new PosOutOfException("pos位置不合法!");}return elem[pos];}/*** 更新pos下标的值为value* @param pos* @param value*/@Overridepublic void set(int pos, int value) {//pos的合法性if(pos < 0 || pos >= usedSize){throw new PosOutOfException("pos位置不合法!");}elem[pos] = value;}/*** 删除数据toRemove* @param toRemove*/@Overridepublic void remove(int toRemove) {//找到toRemove数据int pos = indexOf(toRemove);if (pos>=0){//将toRemove后面的数据整体往前移动(将toRemove数据覆盖住相当于将其删除)for (int i = pos; i < usedSize-1 ; i++) {elem[i] = elem[i+1];}usedSize--;}}/***获取当前数组的有效数据个数* @return*/@Overridepublic int size() {return this.usedSize;}/***清空数组*/@Overridepublic void clear() {this.usedSize=0;}/***输出当前数据的所有数据*/@Overridepublic void display() {for (int i = 0; i < usedSize; i++) {System.out.print(elem[i] + " ");}System.out.println();}/*** 判满* @return*/@Overridepublic boolean ifFull() {return usedSize==elem.length;}/***判空* @return*/@Overridepublic boolean isEmpty() {return usedSize==0;}
}
IList接口:
public interface IList {// 新增元素,默认在数组最后新增void add(int data);// 在 pos 位置新增元素void add(int pos, int data);// 判定是否包含某个元素boolean contains(int toFind) ;// 查找某个元素对应的位置int indexOf(int toFind) ;// 获取 pos 位置的元素int get(int pos);// 给 pos 位置的元素设为 valuevoid set(int pos, int value);//删除第一次出现的关键字keyvoid remove(int toRemove);// 获取顺序表长度int size();// 清空顺序表void clear();// 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的void display();//判断数组是不是满了boolean ifFull();//判断数组的有效数据是否为空boolean isEmpty();
}
自定义的PosOutOfException异常:
public class PosOutOfException extends RuntimeException{public PosOutOfException(){}public PosOutOfException(String msg){super(msg);}
}
Test类:
public class Test {public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.add(1);myArrayList.add(2);myArrayList.add(3);myArrayList.add(3,4);System.out.println(myArrayList.contains(2));//trueSystem.out.println(myArrayList.indexOf(2));//1System.out.println(myArrayList.get(1));//2myArrayList.set(1,11);myArrayList.remove(11);myArrayList.display();// 1 3 4myArrayList.clear();}
}
问:如果现在usedSize是3,可以指定插入下标4位置吗?
答:不可以,插入数据时,必须要有一个唯一的前驱,不可以跳着插入。
5. ArrayList使用
5.1 ArrayList的构造
方法 | 解释 |
---|---|
ArrayList() | 无参构造 |
ArrayList(Collection<? extends E> c) | 利用其他 Collection 构建 ArrayList |
ArrayList(int initialCapacity) | 指定顺序表初始容量 |
public static void main(String[] args) {// ArrayList创建,推荐写法// 构造一个空的列表List<Integer> list1 = new ArrayList<>();// 构造一个具有10个容量的列表List<Integer> list2 = new ArrayList<>(10);list2.add(1);list2.add(2);list2.add(3);// list2.add("hello"); // 编译失败,List<Integer>已经限定了,list2中只能存储整形元素// list3构造好之后,与list中的元素一致ArrayList<Integer> list3 = new ArrayList<>(list2);// 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难List list4 = new ArrayList();list4.add("111");list4.add(100);}
5.2 ArrayList常见操作
方法 | 解释 |
---|---|
boolean add(E e) | 尾插 e |
void add(int index, E element) | 将 e 插入到 index 位置 |
boolean addAll(Collection<? extends E> c) | 尾插 c 中的元素 |
E remove(int index) | 删除 index 位置元素 |
boolean remove(Object o) | 删除遇到的第一个 o |
E get(int index) | 获取下标 index 位置元素 |
E set(int index, E element) | 将下标 index 位置元素设置为 element |
void clear() | 清空 |
boolean contains(Object o) | 判断 o 是否在线性表中 |
int indexOf(Object o) | 返回第一个 o 所在下标 |
int lastIndexOf(Object o) | 返回最后一个 o 的下标 |
List subList(int fromIndex, int toIndex) | 截取部分 list |
上面是我们自己实现的一个ArrayList,在Java中有现成的ArrayList,可以直接拿来使用。
Mian类:
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(11);list.add(22);list.add(33);ArrayList<Integer> list1 = new ArrayList<>();list1.add(111);list1.add(222);list1.add(333);list.addAll(list1);//表示将list1中的所有数据都添加在list上System.out.println(list);//[11, 22, 33, 111, 222, 333]}
}
方法boolean addAll(Collection<? extends E> c)
中的Collection<? extends E>
是参数c的类型,可以看出来这个类型是一个泛型类,这个泛型类的上界E指的是当前的List所指定的类型(Interger),?表示当前List1的类型,用Collection类型来接收,因为所有的泛型类都继承Collection。这里就表示传入的参数c的类型是不是E的类型或者E的类型的子类(List1的类型是不是List的类型,或者List类型的子类)。
这里的List1的类型是Integer,是List的类型,所以能够传入成功。
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(11);list.add(22);list.add(33);ArrayList<String> list2 = new ArrayList<>();list2.add("hello");list2.add("world");list.addAll(list2);//报错System.out.println(list);}
}
输出结果:
java: 不兼容的类型: java.util.ArrayList<java.lang.String>无法转换为java.util.Collection<? extends java.lang.Integer>
这里传入失败的原因就是因为List2的类型是String,它不是List类型Integer,也不是Interger的子类。
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(11);list.add(22);list.add(33);list.add(44);list.remove(1);//删除1下标的值System.out.println(list);}
}
输出结果:
[11, 33, 44]
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(11);list.add(22);list.add(33);list.add(44);list.remove(new Integer(11));//删除数据11,相当于传的是一个对象System.out.println(list);}
}
输出结果:
[22, 33, 44]
在list.remove(new Integer(11));
中Integer下面会画红线。
Main类:
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(11);list.add(22);list.add(33);list.add(44);System.out.println(list);List<Integer> listTemp = list.subList(1,3);//表示截取List中的[1,3)下标的数据System.out.println(listTemp);}
}
输出结果:
[11, 22, 33, 44]
[22, 33]
Main类:
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(11);list.add(22);list.add(33);list.add(44);System.out.println(list);List<Integer> listTemp = list.subList(1,3);//表示截取List中的[1,3)下标的数据System.out.println(listTemp);System.out.println("==============================");listTemp.set(1,222);//表示将listTemp中1下标的值修改为222listTemp.set(0,99);System.out.println("list: "+list);System.out.println("listTemp: " + listTemp);}
}
输出结果:
[11, 22, 33, 44]
[22, 33]
==============================
list: [11, 99, 222, 44]
listTemp: [99, 222]
subList()方法并不是把相应的数据截取出来产生新的对象,而是返回了list 中1下标数据的地址,所以修改listTemp也会影响到list
5.3 ArrayList的遍历
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(11);list.add(22);list.add(33);list.add(44);System.out.println("=========sout直接输出=========");System.out.println(list);System.out.println("========for循环遍历===========");for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + " ");}System.out.println();System.out.println("=========for each循环遍历===========");for (Integer x:list) {System.out.print(x +" ");}System.out.println();System.out.println("===========迭代器遍历1==========");Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()){System.out.print(iterator.next()+ " ");}System.out.println();System.out.println("===========迭代器遍历2==========");ListIterator<Integer> listIterator = list.listIterator();//默认从下标0开始打印while (listIterator.hasNext()){System.out.print(listIterator.next() + " ");}System.out.println();}
}
输出结果:
=========sout直接输出=========
[11, 22, 33, 44]
========for循环遍历===========
11 22 33 44
=========for each循环遍历===========
11 22 33 44
===========迭代器遍历1==========
11 22 33 44
===========迭代器遍历2==========
11 22 33 44
返回值是一个Iterator对象。
相当于iteerator这个迭代器对象去判断有没有下一个,如果有就去打印,iterator.next(),有两个动作,打印下一个的同时让iterator走到下一个。
ListIterator是Interator的子类,ListIterator只能用来接收List。相当于ListIterator是List相关的迭代器。
ListIterator是Interator的子类,ListIterator拓展了一些功能:从后往前打印。
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(11);list.add(22); list.add(33);list.add(44);System.out.println("===========迭代器遍历3=========");ListIterator<Integer> listIterator1 = list.listIterator(list.size());//从最后一个有效数据开始打印while (listIterator1.hasPrevious()){System.out.print(listIterator1.previous() + " ");}System.out.println();}
}
输出结果:
===========迭代器遍历3=========
44 33 22 11
5.4 ArrayList的扩容机制
下面代码有缺陷吗?为什么?
public static void main(String[] args) {List<Integer> list = new ArrayList<>();for (int i = 0; i < 100; i++) {list.add(i);}
}
ArrayList是一个动态类型的顺序表,即:在插入元素的过程中会自动扩容。以下是ArrayList源码中扩容方式:
Object[] elementData; // 存放元素的空间private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; // 默认空间private static final int DEFAULT_CAPACITY = 10; // 默认容量大小public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!elementData[size++] = e;return true;}private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));}private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;}private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;private void grow(int minCapacity) {// 获取旧空间大小int oldCapacity = elementData.length;// 预计按照1.5倍方式扩容int newCapacity = oldCapacity + (oldCapacity >> 1);// 如果用户需要扩容大小 超过 原空间1.5倍,按照用户所需大小扩容if (newCapacity - minCapacity < 0)newCapacity = minCapacity;// 如果需要扩容大小超过MAX_ARRAY_SIZE,重新计算容量大小if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// 调用copyOf扩容elementData = Arrays.copyOf(elementData, newCapacity);}private static int hugeCapacity(int minCapacity) {// 如果minCapacity小于0,抛出OutOfMemoryError异常if (minCapacity < 0)throw new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;}
当我们调用不带参数的构造方法时,第一次进行add元素的时候,会为底层的数组进行内存的分配,此时的大小为10。
6. ArrayList的具体使用
6.1 简单的洗牌算法
Card类:
public class Card {public String suit;//花色public int rank;//牌面值public Card(String suit, int rank) {this.suit = suit;this.rank = rank;}@Overridepublic String toString() {/*return "Card{" +"suit='" + suit + '\'' +", rank=" + rank +'}';*/return "{ "+suit + rank + " }";}
}
Game类:
import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*** Created with IntelliJ IDEA.* Description:* User: Lenovo* Date: 2024-11-25* Time: 20:56*/
public class Game {public static final String[] SUITS = {"♥","♠","♦","♣"};/*** 生成52张牌,每一种花色有13张牌* @return*/public List<Card> creatCards(){ArrayList<Card> cardsList = new ArrayList<>();for (int i = 0; i < SUITS.length; i++) {for (int j = 1; j <= 13; j++) {String suit = SUITS[i];int rank = j;Card card = new Card(suit, rank);cardsList.add(card);}}return cardsList;}/*** 洗牌* 下标之间随机进行交换* @param cardList*/public void shuffle(List<Card> cardList){Random random = new Random();for (int i = cardList.size()-1; i > 0 ; i--) {int randIndex = random.nextInt(i);//生成[0,i)的随机数swap(cardList, i, randIndex);}}/*** 交换两张牌* @param cardList* @param i* @param j*/private void swap(List<Card> cardList, int i, int j){Card temp = cardList.get(i);cardList.set(i, cardList.get(j));cardList.set(j, temp);}/*** 玩牌* 三个人,每个人轮流抓,一共抓5张牌,相当于每个人共5张牌* @param cardList*/public List<List<Card>> play(List<Card> cardList){List<Card> hand0 = new ArrayList<>();List<Card> hand1 = new ArrayList<>();List<Card> hand2 = new ArrayList<>();List<List<Card>> handList = new ArrayList<>();handList.add(hand0);handList.add(hand1);handList.add(hand2);for (int i = 0; i < 5; i++) {for (int j = 0; j < handList.size(); j++) {Card card = cardList.remove(0);handList.get(j).add(card);}}return handList;}
}
Test类:
import java.util.List;
import java.util.ListIterator;/*** Created with IntelliJ IDEA.* Description:* User: Lenovo* Date: 2024-11-25* Time: 20:55*/
public class Test {public static void main(String[] args) {Game game = new Game();List<Card> cardList = game.creatCards();System.out.println(cardList);System.out.println("=============================================================================================");game.shuffle(cardList);System.out.println(cardList);System.out.println("=============================================================================================");List<List<Card>> handList = game.play(cardList);for (int i = 0; i < handList.size(); i++) {System.out.println("第" +(i+1) + "个人的牌是:" + handList.get(i));}System.out.println("=============================================================================================");System.out.println("剩下的牌:" + cardList);}
}
输出结果:
[{ ♥1 }, { ♥2 }, { ♥3 }, { ♥4 }, { ♥5 }, { ♥6 }, { ♥7 }, { ♥8 }, { ♥9 }, { ♥10 }, { ♥11 }, { ♥12 }, { ♥13 }, { ♠1 }, { ♠2 }, { ♠3 }, { ♠4 }, { ♠5 }, { ♠6 }, { ♠7 }, { ♠8 }, { ♠9 }, { ♠10 }, { ♠11 }, { ♠12 }, { ♠13 }, { ♦1 }, { ♦2 }, { ♦3 }, { ♦4 }, { ♦5 }, { ♦6 }, { ♦7 }, { ♦8 }, { ♦9 }, { ♦10 }, { ♦11 }, { ♦12 }, { ♦13 }, { ♣1 }, { ♣2 }, { ♣3 }, { ♣4 }, { ♣5 }, { ♣6 }, { ♣7 }, { ♣8 }, { ♣9 }, { ♣10 }, { ♣11 }, { ♣12 }, { ♣13 }]
=============================================================================================
[{ ♥13 }, { ♥5 }, { ♠6 }, { ♥2 }, { ♥11 }, { ♦4 }, { ♦11 }, { ♦12 }, { ♥3 }, { ♣10 }, { ♠13 }, { ♦8 }, { ♦6 }, { ♥12 }, { ♣5 }, { ♠2 }, { ♦3 }, { ♠8 }, { ♠5 }, { ♣11 }, { ♥6 }, { ♥1 }, { ♣3 }, { ♦5 }, { ♣8 }, { ♣12 }, { ♠11 }, { ♥8 }, { ♣6 }, { ♥4 }, { ♦10 }, { ♠4 }, { ♦1 }, { ♦9 }, { ♠10 }, { ♣9 }, { ♣4 }, { ♠9 }, { ♥9 }, { ♥7 }, { ♠3 }, { ♣1 }, { ♦7 }, { ♠7 }, { ♦13 }, { ♦2 }, { ♣2 }, { ♣7 }, { ♣13 }, { ♠1 }, { ♥10 }, { ♠12 }]
=============================================================================================
第1个人的牌是:[{ ♥13 }, { ♥2 }, { ♦11 }, { ♣10 }, { ♦6 }]
第2个人的牌是:[{ ♥5 }, { ♥11 }, { ♦12 }, { ♠13 }, { ♥12 }]
第3个人的牌是:[{ ♠6 }, { ♦4 }, { ♥3 }, { ♦8 }, { ♣5 }]
=============================================================================================
剩下的牌:[{ ♠2 }, { ♦3 }, { ♠8 }, { ♠5 }, { ♣11 }, { ♥6 }, { ♥1 }, { ♣3 }, { ♦5 }, { ♣8 }, { ♣12 }, { ♠11 }, { ♥8 }, { ♣6 }, { ♥4 }, { ♦10 }, { ♠4 }, { ♦1 }, { ♦9 }, { ♠10 }, { ♣9 }, { ♣4 }, { ♠9 }, { ♥9 }, { ♥7 }, { ♠3 }, { ♣1 }, { ♦7 }, { ♠7 }, { ♦13 }, { ♦2 }, { ♣2 }, { ♣7 }, { ♣13 }, { ♠1 }, { ♥10 }, { ♠12 }]
6.2 杨辉三角
给定一个非负整数 numRows
,生成「杨辉三角」的前 numRows
行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
提示:
1 <= numRows <= 30
OJ链接
示例:
class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> list = new ArrayList<>();//第一行List<Integer> ret0 = new ArrayList<>();ret0.add(1);list.add(ret0);//每一行for (int i = 1; i < numRows; i++) {List<Integer> ret = new ArrayList<>();//每一行的第一个数据ret.add(1);//每一行中的中间数据for (int j = 1; j <= i-1; j++) {ret.add(list.get(i-1).get(j)+list.get(i-1).get(j-1));}//每一行的最后一个数据ret.add(1);list.add(ret);}return list;}
}
相关文章:
【数据结构】--ArrayList与顺序表
文章目录 1. 线性表2. 顺序表3. ArrayList简介4. MyArrayList的实现5. ArrayList使用5.1 ArrayList的构造5.2 ArrayList常见操作5.3 ArrayList的遍历5.4 ArrayList的扩容机制 6. ArrayList的具体使用6.1 简单的洗牌算法6.2 杨辉三角 1. 线性表 线性表(linear list&…...
多线程篇-3--java内存模型(主内存,共享内存,三大特性,指定重排)
Java内存模型 Java Memory Model,简称JMM,本身是一种抽象的概念,实际上并不存在,它描述的是一组规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素࿰…...
Android Studio的AI工具插件使用介绍
Android Studio的AI工具插件使用介绍 一、前言 Android Studio 的 AI 工具插件具有诸多重要作用,以下是一些常见的方面: 代码生成与自动补全 代码优化与重构 代码解读 学习与知识获取 智能搜索与资源推荐实际使用中可以添加注释,解读某段代…...
【Yarn Bug】 yarn 安装依赖出现的网络连接问题
最近,在初始化 Ant Design Pro 前端脚手架过程中,使用 yarn 安装依赖时遇到了网络连接问题,具体错误信息提示为 info There appears to be trouble with your network connection. Retrying...。通过百度查询,得知出现这种问题的原…...
Vue3的Setup语法动态获取Dom或调用子组件方法
官方文档:https://cn.vuejs.org/api/composition-api-setup.html#composition-api-setup 获取Dom <template><div class"todo" ref"todoDom" click"handleClick"></div> </template><script lang"t…...
中科院一区算法KO-K均值优化算法(K-means Optimizer)-附Matlab免费代码
首先,使用K-means算法在每次迭代中建立聚类区域的形心向量,然后KO提出两种移动策略,以在开发和探索能力之间建立平衡。每次迭代中探索或开发的移动策略的决定取决于一个参数,该参数将被设计为识别每个搜索代理是否在访问的区域中过…...
python数据可视化销量柱状图练习
需求: 假设某店铺的商品销量分为 线上销量 和 线下销量: 使用 叠加柱状图 分别显示线上和线下销量。 在柱状图中添加每种商品的总销量。 图表美观,包含图例、网格、颜色区分等。 代码实现: import matplotlib.pyplot as plt imp…...
甘特图全面指南:原理、制作与实际案例
甘特图(Gantt Chart)是一种用于项目管理的直观工具,以条形图的形式展示任务的时间进度和依赖关系。它通过简单明了的视觉效果帮助团队跟踪任务进展,分配资源并优化时间安排。本文将深入介绍甘特图的定义、制作方法,以及…...
如何创建 MySQL 数据库的副本 ?
MySQL 是一个广泛使用的开源数据库系统,它提供了多种数据库复制的方法。此功能对于确保跨不同环境的数据可用性和完整性至关重要。 管理 MySQL 数据库通常需要创建数据库的副本。这个任务被称为 MySQL 数据库复制,对于备份、测试、服务器迁移和其他关键…...
基于YOLO模型的目标检测与识别实现在ESP32-S3 EYE上全流程部署
前言 文章首发于 基于YOLO模型的目标检测与识别实现在ESP32-S3 EYE上全流程部署 文章目录 前言项目环境安装ESP-IDF安装开发环境运行环境 训练数据集准备添加自定义数据集 下载预训练模型训练 YOLO 模型模型量化和格式转换模型结果评估训练损失评估指标模型推理 模型部署部署环…...
2411C++,CXImage简单使用
介绍 CxImage是一个可非常简单快速的加载,保存,显示和转换图像的C类. 文件格式和链接的C库 Cximage对象基本上是加了一些成员变量来保存有用信息的一个位图: class CxImage{...protected:void* pDib; //包含标题,调色板,像素BITMAPINFOHEADER head; //标准头文件CXIMAGEINFO…...
Java对象与XML互相转换(xstream)
依赖 <dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.18</version></dependency> 实体类 package com.itheima.util;import lombok.AllArgsConstructor; import lom…...
计算机视觉工程师紧张学习中!
在当今这个日新月异的科技时代,计算机视觉作为人工智能的重要分支,正以前所未有的速度改变着我们的生活和工作方式。为了紧跟时代步伐,提升自我技能,一群怀揣梦想与热情的计算机视觉设计开发工程师们聚集在了本次线下培训活动中。…...
网关整合sentinel无法读取nacos配置问题分析
sentinel无法读取nacos配置问题分析 1.spring-cloud-gateway整合sentinel2.问题现象3.原因猜测4.源码分析4. 结语 最近公司需要上线一个集约项目,虽然为内网项目,但曾经有过内网被攻破,导致内部系统被攻击的案例,且集约系统同时在…...
速盾:高防 CDN 中高级缓存有什么用?
在高防 CDN(Content Delivery Network,内容分发网络)的服务体系里,高级缓存功能犹如一颗强大的 “性能优化引擎”,对于提升网站或应用的运行效率、减轻源站压力以及改善用户体验等诸多方面都发挥着极为关键的作用。 一…...
大数据期末笔记
第一章、大数据概述 人类的行为及产生的事件的一种记录称之为数据。 1、大数据时代的特征,并结合生活实例谈谈带来的影响。 (一)特征 1、Volume 规模性:数据量大。 2、Velocity高速性:处理速度快。数据的生成和响…...
Qt详解QUiLoader 动态加载UI文件
文章目录 详解 QUiLoader 模块的使用1. QUiLoader 简介1.1 应用场景 2. 准备工作2.1 添加模块依赖2.2 引入头文件 3. 使用 QUiLoader 加载界面3.1 示例代码form.uimain.cpp 4. 常用方法详解4.1 load函数原型作用参数返回值示例代码 4.2 createWidget函数原型作用参数返回值示例…...
Android -- 简易音乐播放器
Android – 简易音乐播放器 播放器功能:* 1. 播放模式:单曲、列表循环、列表随机;* 2. 后台播放(单例模式);* 3. 多位置同步状态回调;处理模块:* 1. 提取文件信息:音频文…...
云平台与阿里云服务器使用
云平台 云就是一堆远程计算机组成的集群。 计算就是各种软件服务。 云平台就是远程计算机集群提供的的各种服务所组成的远程服务平台。 云平台提供的服务主要可以分为三个类别: I 服务 P服务 S服务 i就是基础设施服务infrastructure p就是平台服务platform …...
Dart 中 initializer lists
在 Dart 中,initializer lists 是构造函数的一种特性,允许你在进入构造函数体之前对某些字段进行初始化或进行检查。这些字段包括 final 字段,因为 final 字段必须在构造函数体运行之前被初始化。 以下是它的几个关键点和适用场景࿱…...
02.06、回文链表
02.06、[简单] 回文链表 1、题目描述 编写一个函数,检查输入的链表是否是回文的。 2、解题思路: 快慢指针找中点: 利用快慢指针的技巧来找到链表的中间节点。慢指针 slow 每次移动一步,而快指针 fast 每次移动两步。这样&…...
linux中限定特定用户使用crontab
在Linux中,crontab(cron table)是用来定时执行任务的工具。默认情况下,任何用户(包括普通用户)都可以为自己的账户创建和管理crontab条目,但前提是这个用户拥有对/var/spool/cron/crontabs目录的…...
Oracle Universal Unique Identifier (UUID)
本文介绍Oracle生成全局唯一ID的函数SYS_GUID,后续会对SYS_GUID和Sequence两种方法进行比较。 SYS_GUID 函数生成并返回一个由 16 个字节组成的全局唯一标识符(RAW 值)。在大多数平台上,生成的标识符由主机标识符、调用该函数的进…...
LangChain——加载知识库文本文档 PDF文档
文档加载 这涵盖了如何加载目录中的所有文档。 在底层,默认情况下使用 UnstructedLoader。需要安装依赖 pip install unstructuredpython导入方式 from langchain_community.document_loaders import DirectoryLoader我们可以使用 glob 参数来控制加载特定类型文…...
shell编程3,参数传递+算术运算
声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…...
Spring boot之BeanDefinition介绍
在spring框架中IOC容器进行bean的创建和管理。Bean的创建是一个比较复杂的过程,它并不像我们创建对象一样只是直接new一下就行,虽然有些bean确实就是New一下。但在Spring中可以通过一些途径对bean进行增强扩展。在这个过程中,BeanDefinition作…...
JAVA:Spring Boot 3 实现 Gzip 压缩优化的技术指南
1、简述 随着 Web 应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈。为了减少数据传输量,提高用户体验,我们可以使用 Gzip 压缩 HTTP 响应。本文将介绍如何在 Spring Boot 3 中实现 Gzip 压缩优化。 2、配置 Spring Boot 3 对…...
探索 IntelliJ IDEA 中 Spring Boot 运行配置
前言 IntelliJ IDEA 作为一款功能强大的集成开发环境(IDE),为 Spring Boot 应用提供了丰富的运行配置选项,定义了如何在 IntelliJ IDEA 中运行 Spring Boot 应用程序,当从主类文件运行应用程序时,IDE 将创建…...
Java学习,反射
Java反射是Java编程语言的一个重要特性,它允许程序在运行时查看任意对象所属的类,获取类的内部信息(包括构造器、字段和方法等),并能动态地调用对象的方法或构造器。 反射概念 反射(Reflection)…...
应急响应靶机——Windows挖矿事件
载入虚拟机,开启虚拟机: (账户密码:administrator/zgsf123) 发现登录进去就弹出终端界面,自动运行powshell命令,看来存在计划任务,自动下载了一些文件,之后就主动结束退…...
0017. shell命令--tac
目录 17. shell命令--tac 功能说明 语法格式 选项说明 实践操作 注意事项 17. shell命令--tac 功能说明 Linux 的 tac 命令用于按行反向输出文件内容,与 cat 命令的输出顺序相反。非常有趣,好记。也就是说,当我们使用tac命令查看文件内…...
富文本编辑器图片上传并回显
1.概述 在代码业务需求中,我们会经常涉及到文件上传的功能,通常来说,我们存储文件是不能直接存储到数 据库中的,而是以文件路径存储到数据库中;但是存储文件的路径到数据库中又会有一定的问题,就是 浏览…...
深入学习MapReduce:原理解析与基础实战
标题:深入学习MapReduce:原理解析与基础实战 MapReduce是一种分布式计算框架,用于大规模数据的处理和分析。作为Hadoop生态系统的核心组件,MapReduce凭借其简单的编程模型和强大的并行计算能力,广泛应用于大数据领域。…...
医院数据库优化:提升性能与响应时间的关键策略
一、引言 在当今数智化时代,医院信息系统不仅要追踪管理伴随人流、财流、物流所产生的管理信息,还应支持以病人医疗信息记录为中心的整个医疗、科学、科研活动,提高整个医院的运作效率。但随着信息化系统积累数据的增长,特别是病…...
OpenAI Whisper 语音识别 模型部署及接口封装
环境配置: 一、安装依赖: pip install -U openai-whisper 或者,以下命令会从这个存储库拉取并安装最新的提交,以及其Python依赖项: pip install githttps://github.com/openai/whisper.git 二、安装ffmpeg: cd …...
设计模式 外观模式 门面模式
结构性模式-外观模式 门面模式 适用场景:如果你需要一个指向复杂子系统的直接接口, 且该接口的功能有限, 则可以使用外观模式。 不用关心后面的查询具体操作 /*** 聚合查询接口*/ RestController RequestMapping("/search") Slf…...
AI智算-正式上架GPU资源监控概览 Grafana Dashboard
下载链接 https://grafana.com/grafana/dashboards/22424-ai-gpu-20241127/...
颜色分类
颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数…...
使用 pycharm 新建使用 conda 虚拟 python 环境的工程
1. conda 常见命令复习: conda env list // 查看 conda 环境列表 conda activate xxxenv // 进入指定 conda 环境2. 环境展示: 2.1. 我的物理环境的 Python 版本为 3.10.9: 2.2. 我的 conda 虚拟环境 env_yolov9_python_3_8 中的 pyth…...
图形渲染性能优化
variable rate shading conditional render 设置可见性等, 不需要重新build command buffer indirect draw glMultiDraw* - 直接支持多次绘制glMultiDrawIndirect - 间接多次绘制multithreading 多线程录制 实例化渲染 lod texture array 小对象剔除 投影到…...
14、保存与加载PyTorch训练的模型和超参数
文章目录 1. state_dict2. 模型保存3. check_point4. 详细保存5. Docker6. 机器学习常用库 1. state_dict nn.Module 类是所有神经网络构建的基类,即自己构建一个深度神经网络也是需要继承自nn.Module类才行,并且nn.Module中的state_dict包含神经网络中…...
简单获取json预览
data: JSON 数据。 collapsedNodeLength: 对象或数组的长度超过此阈值时会折叠 deep: json路径深度超过此值时会折叠 showLineNumber: 显示左侧行号 showIcon: 显示图标。 virtual: 使用虚拟滚动 height: 使用虚拟滚动时列表的高度 itemHeight: 使用虚拟滚动时节点的高…...
【C语言】连接陷阱探秘(5):头文件
目录 一、头文件的作用 1.1. 声明共享 1.2. 模块化 1.3. 实践中的注意事项 二、常见的头文件陷阱 2.1 重复包含(Include Guards) 2.1.1. Include Guard 工作原理 2.1.2. Pragma Once(某些编译器支持) 2.2 循环依赖(Circular Dependencies) 2.2.1. 前向声明 2.…...
burpsuite功能模块学习(2)
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势)
Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势) Composition API 的优势1. Options API 存在的问题2. Composition API 的优势 Composition API 的优势 1. Options API 存在的问题 笔记 使用传统OptionsA…...
在 ASP.NET C# Web API 中实现 Serilog 以增强请求和响应的日志记录
介绍 日志记录是任何 Web 应用程序的关键方面。它有助于调试、性能监控和了解用户交互。在 ASP.NET C# 中,集成 Serilog 作为记录请求和响应(包括传入和传出的数据)的中间件可以显著提高 Web API 的可观察性和故障排除能力。 在过去的几周里&…...
MongoDB集群分片安装部署手册
文章目录 一、集群规划1.1 集群安装规划1.2 端口规划1.3 目录创建 二、mongodb安装(三台均需要操作)2.1 下载、解压2.2 配置环境变量 三、mongodb组件配置3.1 配置config server的副本集3.1.1 config配置文件3.1.2 config server启动3.1.3 初始化config …...
DimensionX 学习部署笔记
目录 依赖项: huggingface/DimensionX 是huggingface 下载后的目录; 报错处理参考网址: 测试代码 ok: 依赖项: pip install peft huggingface/DimensionX 是huggingface 下载后的目录; orbit_left_lora_weights.safetensors orbit_up_lora_weights.safetensors …...
设计模式:11、迭代器模式(游标)
目录 0、定义 1、迭代器模式的四种角色 2、迭代器模式的UML类图 3、示例代码 4、迭代器的next()方法与集合的get(int index)方法的效率对比(LinkedList为例) 0、定义 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象…...
【CameraPoseRefinement】以BARF为例介绍三维重建中的位姿优化
文章目录 IntroductionApproachPlanar Image Alignment(2D)Neural Radiance Fields (3D)Bundle-Adjusting Neural Radiance Fields Experiment平面图像对齐的定性实验合成场景上的定量实验 Introduction 在计算机视觉三维重建中,求解3D场景的表示和定位给定的相机帧…...