【Java数据结构】 ArrayList 顺序表

news2024/11/19 9:24:10

一、什么是List

在集合框架中,List是一个接口,继承自Collection

Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:

Iterable 也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下:

站在数据结构的角度来看, List 就是一个线性表,即 n 个具有相同类型元素的有限序列,在该序列上可以执行增删 改查以及变量等操作
面试题 Collection 中有那些方法?

二. 常见接口介绍

List 中提供了好的方法,具体如下

方法

解释

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<E> subList(int fromindex, int tolndex)

截取部分 list

虽然方法比较多,但是常用方法如下:

三. List的使用

注意: List 是个接口,并不能直接用来实例化
如果要使用,必须去实例化 List 的实现类。在集合框架中, ArrayList LinkedList 都实现了 List 接口

四、线性表

        线性表( linear list n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...
        线性表在 逻辑上是线性结构 ,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

五、顺序表 

        顺序表是用一段物理地址连续 的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

顺序表底层其实是动态数组

接口的实现

public interface IList{
    // 新增元素,默认在数组最后新增
    public void add(int data);
    boolean isFull();
    // 在 pos 位置新增元素
    public void add(int pos, int data);
    // 判定是否包含某个元素
    public boolean contains(int toFind);
    // 查找某个元素对应的位置
    public int indexOf(int toFind);
    // 获取 pos 位置的元素
    public int get(int pos);
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value);
    //删除第一次出现的关键字key
    public void remove(int toRemove);
    // 获取顺序表长度
    public int size() ;
    // 清空顺序表
    public void clear();
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display() ;
}

自行实现MyArrayList实现上述接口

package List;

import java.util.ArrayList;
import java.util.Arrays;

public class MyArrayList implements IList {
    public int[] array;
    public int usedSize;
    public static final int default_capacity = 10;//默认常量容量值

    public MyArrayList() {
        this.array = new int[default_capacity];//分配空间,默认值为0
    }

    //扩容
    private void grow () {
        this.array = Arrays.copyOf(this.array, array.length * 2);
    }
    @Override
    //顺序表是否满了
    public boolean isFull() {
        return this.usedSize == this.array.length;
    }

    @Override
    public void add(int data) {
        if (isFull()) {
            grow();
        }
        this.array[this.usedSize] = data;
        this.usedSize++;
    }


    //下标有问题时,抛异常
    private void checkPos(int pos)throws PosIllegal {
        if (pos<0||pos>usedSize){
            throw new PosIllegal("pos位置不合法");
        }
    }
    @Override
    public void add(int pos, int data) {
        try {
            checkPos(pos);
        }catch (PosIllegal e){
            System.out.println("插入位置pos不合法");
            e.printStackTrace();
            return;
        }
        if (isFull()) {
            grow();
        }
        for (int i = this.usedSize-1; i >=pos ; i--) {
            array[i+1]=array[i];
        }
        array[pos]=data;
        this.usedSize++;
    }

    @Override
    public boolean contains(int toFind) {
        for (int i=0;i<array.length;i++) {
            if(array[i]==toFind){
                return true;
            }
        }
        return false;
    }

    @Override
    public int indexOf(int toFind) {
        for (int i=0;i<array.length;i++) {
            if(array[i]==toFind){
                return i;
            }
        }
        return -1;
    }
    private void checkPos2(int pos)throws PosIllegal {
        if (pos<0||pos>=usedSize){
            throw new PosIllegal("pos位置不合法");
        }
    }
    @Override
    public int get(int pos) {
        try {
            checkEmpty();
            checkPos2(pos);
            return array[pos];
        }catch (PosIllegal e){
            System.out.println("寻找位置pos不合法");
            e.printStackTrace();
        }catch (EmptyException e){
            e.printStackTrace();
        }
        return -1;
    }

    public void checkEmpty() {
        if (isEmpty()) {
            throw new EmptyException("顺序表为空!!!!");
        }
    }
    public boolean isEmpty(){
        return usedSize==0;
    }
    @Override
    //更新数组对应位置内容
    public void set(int pos, int value) {
        try {
            checkEmpty();
            checkPos2(pos);
            array[pos]=value;
        }catch (PosIllegal e){
            System.out.println("寻找位置pos不合法");
            e.printStackTrace();
        }catch (EmptyException e){
            e.printStackTrace();
        }
    }

    @Override
    public void remove(int toRemove) {
        try {
            checkEmpty();
            int pos=indexOf(toRemove);
            if (pos==-1){
                return;
            }else {
                for (int i = pos; i <usedSize-1 ; i++) {
                    array[i] =array[i+1];
                }
                usedSize--;
            }
        }catch (EmptyException e){
            e.printStackTrace();
        }

    }

    @Override
    public int size() {
        return usedSize;
    }

    @Override
    public void clear() {
        //引用类型防止空间泄露
        /*for (int i = 0; i < usedSize; i++) {
            array[i]=null;
        }*/

        usedSize=0;
    }

    @Override
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display() {
       /* for (int i:array) {
            System.out.print(i + " ");
        }*/
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

顺序表优点:查询非常快,达到O(1)

顺序表缺点:移动非常慢,达到O(N)

六、ArrayList简介

        在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:

说明
1. ArrayList是以泛型方式实现的,使用时必须要 先实例化
2. ArrayList实现了RandomAccess接口,表明ArrayList 支持随机访问
3. ArrayList实现了Cloneable接口,表明ArrayList是 可以clone的
4. ArrayList实现了Serializable接口,表明ArrayList是 支持序列化的
5. 和Vector不同,ArrayList不是线程安全的,在 单线程下可以使用,在多线程中可以选择Vector或CopyOnWriteArrayList
6. ArrayList底层是一段 连续的空间,并且可以动态扩容,是一个 动态类型的顺序表


Tip:ArrayList<Integer>和List<Integer>的区别

ArrayList<Integer>list=new ArrayList<>();

通过list这个引用 可以调用 当前类的所有可以被调用的方法

List<Integer>list1 = new ArrayList<>();
只要实现这个接口的都能引用,向上转型
通过这个接口 只能调用这个接口当中包含的方法

七、ArrayList使用  

ArrayList底层原码

  • private static final int DEFAULT_CAPACITY = 10;//默认的容量
  • private static final Object[] EMPTY_ELEMENTDATA = {};//空顺序表
  • private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  • transient 0bject[]  elementData;//当时定义顺序表的时候的 数组
  • private int size;//当时自己定义的usedSize

1.ArrayList的构造

(1)ArrayList()

就是在第一次add的时候分配内存,大小为DEFAULT_CAPACITY

如果后面满了,那么就是1.5倍扩容

(2)ArrayList(Collection<? extends E>c)

传入的形参只要满足实现了 Collection接口即可

<? extends E>:?要么是E,要么是E的子类

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        ArrayList<Integer> list2=new ArrayList<>(list);
    }
}

(3)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);
    }

2 ArrayList常见操作

        ArrayList虽然提供的方法比较多,但是常用方法如下所示,需要用到其他方法时,自行查 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<E> subList(int fromindex, int tolndex)

截取部分 list

Tip:

1.remove()默认是删除对应下标,如果想删除表中数据的话,需要new

list2.remove(1);
list2.remove(new Integer(99));

 

2.set方法

public class Test {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        ArrayList<Integer> list2 = new ArrayList<>(list);
        list2.add(4);
        list2.add(5);
        list2.add(6);
        System.out.println(list2);//1 2 3 4 5 6 
        List<Integer> L=list2.subList(1,3);
        System.out.println(L);//2 3
        L.set(0,99);
        System.out.println(L);//99 3
        System.out.println(list2);//预期应当是1 2 3 4 5 6
    }
}

 L直接引用了list2的1下标至3下标位置,所以修改L同时也修改了list2

混合使用:

  public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("JavaSE");
        list.add("JavaWeb");
        list.add("JavaEE");
        list.add("JVM");
        list.add("测试课程");
        System.out.println(list);
// 获取list中有效元素个数
        System.out.println(list.size());
// 获取和设置index位置上的元素,注意index必须介于[0, size)间
        System.out.println(list.get(1));
        list.set(1, "JavaWEB");
        System.out.println(list.get(1));
// 在list的index位置插入指定元素,index及后续的元素统一往后搬移一个位置
        list.add(1, "Java数据结构");
        System.out.println(list);
// 删除指定元素,找到了就删除,该元素之后的元素统一往前搬移一个位置
        list.remove("JVM");
        System.out.println(list);
// 删除list中index位置上的元素,注意index不要超过list中有效元素个数,否则会抛出下标越界异常
        list.remove(list.size()-1);
        System.out.println(list);
        // 检测list中是否包含指定元素,包含返回true,否则返回false
        if(list.contains("测试课程")){
            list.add("测试课程");
        }
// 查找指定元素第一次出现的位置:indexOf从前往后找,lastIndexOf从后往前找
        list.add("JavaSE");
        System.out.println(list.indexOf("JavaSE"));
        System.out.println(list.lastIndexOf("JavaSE"));
// 使用list中[0, 4)之间的元素构成一个新的SubList返回,但是和ArrayList共用一个elementData数组
        List<String> ret = list.subList(0, 4);
        System.out.println(ret);
        list.clear();
        System.out.println(list.size());
    }

3 ArrayList的遍历

ArrayList 可以使用三方方式遍历: for 循环 + 下标、 foreach 、使用迭代器
 public static void main(String[] args) {
            ArrayList<Integer> list = new ArrayList<>();
            list.add(1);
            list.add(2);
            list.add(3);
            ArrayList<Integer> list2 = new ArrayList<>(list);
            list2.add(4);
            list2.add(5);
            list2.add(6);
            System.out.println("===========for循环输出=============");
            for (int i = 0; i < list2.size(); i++) {
                System.out.print(list2.get(i)+"  ");
            }
        System.out.println();
         System.out.println("===========foreach循环输出=============");
        for (Integer  i:list2) {
            System.out.print(i+"  ");
        }
        System.out.println();
        System.out.println("===========iterator迭代器循环输出=============");
        Iterator<Integer> it=list2.iterator();
        while (it.hasNext()){
            System.out.print(it.next()+" ");
        }
        System.out.println();
        System.out.println("===========listIterator迭代器循环输出=============");
        ListIterator<Integer> it2= list2.listIterator();
        while (it2.hasNext()){
            System.out.print(it2.next()+" ");
        }
        System.out.println();
    }
注意:
1. ArrayList 最长使用的遍历方式是: for 循环 + 下标 以及 foreach
2. 迭代器是设计模式的一种,后序容器接触多了再给大家讲解
3.listIterator迭代器实现了Iterator迭代器,有更多的方法
 System.out.println("===========listIterator迭代器倒序循环输出=============");
        ListIterator<Integer> it3= list2.listIterator();
        while (it2.hasPrevious()){
            System.out.print(it2.previous()+" ");
        }
        System.out.println();
    }


System.out.println("===========listIterator迭代器指定位置倒序循环输出=============");
        ListIterator<Integer> it4= list2.listIterator(3);
        while (it4.hasPrevious()){
            System.out.print(it4.previous()+" ");
        }
        System.out.println();

 

4 ArrayList的扩容机制

总结
1. 检测是否真正需要扩容,如果是调用 grow 准备扩容
2. 预估需要库容的大小
  • 初步预估按照1.5倍大小扩容
  • 如果用户所需大小超过预估1.5倍大小,则按照用户所需大小扩容
  • 真正扩容之前检测是否能扩容成功,防止太大导致扩容失败
3. 使用 copyOf 进行扩容

八. ArrayList的具体使用

1.删除部分内容

str1: welcome to AHU
str2 : come
删除str1中出现的 所有str2的字符 删除之后的结果:wl t AHU

public class Test2 {
    public static void main(String[] args) {
        String str1="welcome to AHU";
        String str2="come";
        ArrayList<Character> ret=new ArrayList<>();

        for (int i = 0; i <str1.length() ; i++) {
            char ch=str1.charAt(i);
            if(str2.contains(ch+"")==false){
                ret.add(ch);
            }
        }
        for (int i = 0; i < ret.size(); i++) {
            System.out.print(ret.get(i));
        }
    }
}

2.杨辉三角

 public static List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret= new ArrayList<>();
        List<Integer> firstRow=new ArrayList<>();
        firstRow.add(1);
        ret.add(firstRow);
        for (int i = 1; i <numRows ; i++) {//第一行已经放入
            List<Integer> curRow=new ArrayList<>();
            //首元素
            curRow.add(1);
            //找到当前行的上一行的数组
            List<Integer> prevRow=ret.get(i-1);
            //处理中间元素
            for (int j = 1; j < i; j++) {//第一列和最后一列已经放入
                int val1= prevRow.get(j);
                int val2= prevRow.get(j-1);
                curRow.add(val1+val2);
            }
            //末元素
            curRow.add(1);
            ret.add(curRow);
        }
        return ret;
    }

具体进行每个元素打印

 public static void main(String[] args) {
        List<List<Integer>> ret= Solution.generate(4);
        for (int i = 0; i < ret.size(); i++) {
            for (int j = 0; j < ret.get(i).size(); j++) {
                System.out.print(ret.get(i).get(j)+" ");
            }
            System.out.println();
        }
    }

3 简单的洗牌算法

package WashCard;

public class Card {
    private String suit;//花色
    private int rank;//面额

    public Card(String suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

    public String toString(){
        return "{"+this.suit+","+this.rank+"}";
    }
}

1.买52张牌

 public static final String[] suits={"♥","♠","♣","♦"};
    public List<Card> buyCard(){
        List<Card> cardList=new ArrayList<>();
        for (int i = 0; i < 13; i++) {
            for (int j = 0; j < 4; j++) {
                int rank=i;
                String suit=suits[j];
                Card card=new Card(suit,rank);
                cardList.add(card);
            }
        }
        return cardList;
    }
2.洗牌
public void shuffle(List<Card> cardList){
        Random random=new Random();
        for (int i = cardList.size()-1; i >0; i--) {
            int index=random.nextInt(i);
            swap(cardList,i,index);
        }
    }
    private void swap(List<Card> cardList,int i,int j){
        Card tmp=cardList.get(i);
        cardList.set(i,cardList.get(j));
        cardList.set(j,tmp);
    }
3.3个人  每个人   轮流揭牌5张
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>> hand=new ArrayList<>();
        hand.add(hand0);
        hand.add(hand1);
        hand.add(hand2);
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Card card=cardList.remove(0);
                hand.get(j).add(card);
            }

        }
        return hand;
    }

测试:

package WashCard;

import java.util.List;

public class Test {
    public static void main(String[] args) {
        //1.买52张牌
        CardDemo cardDemo=new CardDemo();
        List<Card> cardList=cardDemo.buyCard();
       // System.out.println(cardList);
        //2.洗牌
        cardDemo.shuffle(cardList);
        //3.3个人  每个人   轮流揭牌5张
        List<List<Card>> hand=cardDemo.play(cardList);
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第"+(i+1)+"个人的牌有这些:  "+hand.get(i));
        }
    }
}

综合完整代码:

package WashCard;

public class Card {
    private String suit;//花色
    private int rank;//面额

    public Card(String suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

    public String toString(){
        return "{"+this.suit+","+this.rank+"}";
    }
}



package WashCard;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class CardDemo {
    public static final String[] suits={"♥","♠","♣","♦"};
    public List<Card> buyCard(){
        List<Card> cardList=new ArrayList<>();
        for (int i = 0; i < 13; i++) {
            for (int j = 0; j < 4; j++) {
                int rank=i;
                String suit=suits[j];
                Card card=new Card(suit,rank);
                cardList.add(card);
            }
        }
        return cardList;
    }
    public void shuffle(List<Card> cardList){
        Random random=new Random();
        for (int i = cardList.size()-1; i >0; i--) {
            int index=random.nextInt(i);
            swap(cardList,i,index);
        }
    }
    private void swap(List<Card> cardList,int i,int j){
        Card tmp=cardList.get(i);
        cardList.set(i,cardList.get(j));
        cardList.set(j,tmp);
    }
    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>> hand=new ArrayList<>();
        hand.add(hand0);
        hand.add(hand1);
        hand.add(hand2);
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Card card=cardList.remove(0);
                hand.get(j).add(card);
            }

        }
        return hand;
    }
}


package WashCard;

import java.util.List;

public class Test {
    public static void main(String[] args) {
        //1.买52张牌
        CardDemo cardDemo=new CardDemo();
        List<Card> cardList=cardDemo.buyCard();
       // System.out.println(cardList);
        //2.洗牌
        cardDemo.shuffle(cardList);
        //3.3个人  每个人   轮流揭牌5张
        List<List<Card>> hand=cardDemo.play(cardList);
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第"+(i+1)+"个人的牌有这些:  "+hand.get(i));
        }
    }
}

九、ArrayList的问题及思考

1. ArrayList 底层使用连续的空间,任意位置插入或删除元素时,需要将该位置后序元素整体往前或者往后搬移,故时间复杂度为O(N)
2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。
3. 增容一般是呈 2 倍的增长,势必会有一定的空间浪费。例如当前容量为 100 ,满了以后增容到 200 ,我们再继续插入了5 个数据,后面没有数据插入了,那么就浪费了 95 个数据空间。
思考 : 如何解决以上问题呢?

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

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

相关文章

Unity Asset Store的默认下载位置及更改下载路径的方法

修改Unity Asset Store的默认下载路径 Unity Asset Store默认下载位置 Unity Asset Store里下载资源&#xff0c;默认是下载到C盘里的&#xff0c;如果你不想做C盘战士的话&#xff0c;记得将下载的资源转移到其他盘。 Unity商城默认下载路径是C:\用户\用户名&#xff08;一般…

电脑扬声器无法识别,没有声音处理

原因感觉就是前几天安装Realtek Audio Control驱动的时候&#xff0c;没有关闭360&#xff0c;导致的问题。 音量那里一直是 解决方法 开始菜单搜索“设备管理器” 在“声音、视频和游戏控制器”找到识别错的设备 右键“卸载设备” 右键扫描一下设备 此时一般就好了 …

数据结构-LRU缓存(C语言实现)

遇到困难&#xff0c;不必慌张&#xff0c;正是成长的时候&#xff0c;耐心一点&#xff01; 目录 前言一、题目介绍二、实现过程2.1 实现原理2.2 实现思路2.2.1 双向链表2.2.2 散列表 2.3 代码实现2.3.1 结构定义2.3.2 双向链表操作实现2.3.3 实现散列表的操作2.3.4 内存释放代…

N32L40x基于串口的IAP升级升级速度2Mbps+上位机工具

1.软件升级流程 mcu开机上位机发送0xaa,0xaa,0x55,0x55,通知mcu进入升级状态,在收到该指令后,mcu擦除旧的APP程序,发送进入升级状态的指令,通知上位机进入升级状态擦除完成后进入升级状态,等待上位机发送升级包上位机开始发送数据包mcu接收数据包,并等待一个完成的数据包…

51单片机的智能家居【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温湿度传感器DS1302时钟模块光照传感器烟雾传感器蓝牙继电器按键、蜂鸣器、LED等模块构成。适用于智能家居监控烟雾、温湿度、光照和蓝牙控制等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间、室内温湿度…

【优选算法之哈希表】No.11--- 经典哈希表算法

文章目录 前言一、哈希表简介1.1 什么是哈希表1.2 哈希表的用途1.3 什么时候使用哈希表1.4 怎么用哈希表 二、哈希表示例2.1 两数之和2.2 判定是否互为字符重排2.3 存在重复元素2.4 存在重复元素 II2.5 字⺟异位词分组 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1…

重置linux后vscode无法再次使用ssh连接

如果你使用过vscode ssh远程连接了一个Linux系统&#xff0c;但该系统被重置了&#xff0c;并且关键配置没有改变。再次使用vscode连接时&#xff0c;vscode可能无法连接。 原因&#xff1a;vscode远程连接后会在C:\Users{{你的用户名}}.ssh下的known_hosts和known_hosts.old。…

C0008.Clion利用C++开发Qt界面,使用OpenCV时,配置OpenCV方法

安装OpenCV 配置环境 配置Clion中的CMakeLists.txt文件 # 设置OpenCV的安装路径 set(OpenCV_DIR "D:/OpenCv_Win/opencv/build/x64/vc16/lib")# 查找OpenCV包 find_package(OpenCV REQUIRED)下面添加的CMakeLists.txt文件中主要是添加了后面的${OpenCV_LIBS} # 链接…

Innodb磁盘结构

系统表空间 系统表空间的作用 存系统表中的数据存数据字典————保存系统变量和状态变量存变更缓冲区中未来得及落盘的数据 系统表空间文件位置 系统表可以对应磁盘上的多个表空间文件&#xff0c;默认情况下服务器在数据目录下创建一个名为ibdata1的文件 可以通过改变系…

解决方法:PDF文件打开之后不能打印?

打开PDF文件之后&#xff0c;发现文件不能打印&#xff1f;这是什么原因&#xff1f;首先我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

React 解释常见的 hooks: useState / useRef / useContext / useReducer

前言 如果对 re-render 概念还不清楚&#xff0c;建议先看 React & 理解 re-render 的作用、概念&#xff0c;并提供详细的例子解释 再回头看本文。 如果对 React 基础语法还不熟练&#xff0c;建议先看 React & JSX 日常用法与基本原则 再回头看本文。 useState useS…

虚幻引擎-设置UI自适应屏幕大小

在游戏中&#xff0c;如果想实现不同分辨率下&#xff0c;都可以支持当前的UI界面布局&#xff0c;都需要用到锚点功能。 ‌虚幻引擎中的UI锚点&#xff08;Anchor&#xff09;是指控件在屏幕或父物体上的固定点&#xff0c;用于确定控件的位置和布局。‌ 锚点的作用是确保UI元…

【LLM】手搓一个LLM Eval

文章目录 手搓一个LLM Eval项目的动机评测流程概述支持的数据集与评测指标详细的评测过程1. 生成式任务的F1评分1.1 模型推理1.2 结果评测 2. 思考 &#x1f680; 如何运行1. 运行模型推理2. 运行评测 支持的评测指标支持自定义评测学习总结 手搓一个LLM Eval TinyEval&#x…

B. Brightness Begins Codeforces Round 976 (Div. 2)

原题 B. Brightness Begins 解析 Hint 1 第 i 个灯泡最终状态与 n 的大小无关 Hint 2 第 i 个灯泡最终状态与 i 的约数数量的奇偶性相关 Solution 对任意灯泡 i , 它的最终状态由其约数数量的奇偶性相关, 如果 i 有偶数个约数, 那么会是亮的, 否则会是暗的. 换句话说, 如…

第四届高性能计算与通信工程国际学术会议(HPCCE 2024)

目录 大会简介 主办单位&#xff0c;承办单位 征稿主题 会议议程 参会方式 大会官网&#xff1a;www.hpcce.net 大会简介 第四届高性能计算与通信工程国际学术会议&#xff08;HPCCE 2024&#xff09;将于2024年11月22-24日在苏州召开。HPCCE 2024将围绕“高性能计算与通信工…

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SABO-SVR减法平均算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SABO-SVR减法平均算法优化…

CSP-J Day 1 模拟赛补题报告

姓名&#xff1a;王胤皓&#xff0c;校区&#xff1a;和谐校区&#xff0c;考试时间&#xff1a;2024年10月1日9:00:00~12:30:00&#xff0c;学号&#xff1a;S07738 CSP-J Day 1 模拟赛补题报告 前言 考了我们班 Rank 1 1 1。 本人在发烧状态下进行写作&#xff0c;勿喷。…

MySQL 问题小结

mysqld --initialize 初始化 data 文件夹 初始化的密码在这个 err 文件夹中

力扣题解 983

大家好&#xff0c;欢迎来到无限大的判断&#xff0c;祝大家国庆假期愉快 题目描述&#xff08;中等&#xff09; 最低票价 在一个火车旅行很受欢迎的国度&#xff0c;你提前一年计划了一些火车旅行。在接下来的一年里&#xff0c;你要旅行的日子将以一个名为 days 的数组给出…

AI学习记录 -transformer 中对于torch和numpy常用函数的使用方式

在transformer源码中&#xff0c;使用了很多矩阵变换的方法&#xff0c;这些方法太多了&#xff0c;了解底层也没啥意义&#xff0c;也不是啥特别复杂的算法。 所以争取一句话描述这些方法&#xff0c;对照着看transformer的时候&#xff0c;可以衔接自己的思维链。 torch.un…