Java 数据结构篇-用数组、堆实现优先级队列

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
  

文章目录

        1.0 优先级队列说明

        2.0 用数组实现优先级队列

        3.0 无序数组实现优先级队列

        3.1 无序数组实现优先级队列 - 入队列 offer(E value)

        3.2 无序数组实现优先级队列 - 出队列 poll()

        3.3 无序数组实现优先级队列 - 查看队列中优先级最大的元素 peek() 

        3.4 无序数组实现优先级队列 - 判断是否为空队列

        3.5 无序数组实现优先级队列 - 判断是否为满队列

        3.6 无序数组实现优先级队列完整代码

        4.0 有序数组实现优先级队列

        4.1 有序数组实现优先级队列 - 入队列 offer(E value)

        4.2 有序数组实现有序队列 - 出队列 poll()

        4.3 有序数组实现有序队列 - 查看优先级最大的元素 peek()

        4.4 有序数组实现优先级队列 - 判断队列是否为空

        4.5 有序数组实现优先级队列 - 判断队列是否为满队列

        4.6 有序数组实现优先级队列完整代码

        5.0 大顶堆实现优先级队列

        5.1 堆实现优先级队列 - 入队列 offer(E value)

        5.2 堆实现优先级队列 - 出队列 poll()

        5.3 堆实现优先级队列 - 查看优先级最大的元素 peek()

        5.4 堆实现优先级队列 - 判断该队列是否为空

        5.5 堆实现优先级队列 - 判断该队列是否为满队列

        5.6 堆实现优先级队列完整代码


        1.0 优先级队列说明

        优先级队列是一种特殊的队列,其中每个元素都有一个优先级。在优先级队列中,具有最高优先级的元素首先被移除。这与普通队列不同,普通队列是先进先出(FIFO)的,而优先级队列则是按照优先级来确定元素的出队顺序

        优先级队列通常用于需要按照优先级处理元素的场景,比如任务调度、事件处理等。它可以使用不同的数据结构来实现,最常见的是使用堆(heap)来实现优先队列。堆是一种特殊的树形数据结构,它可以快速找到并移除具有最高(或最低)优先级的元素。

        优先级队列的常见操作包括插入元素、移除具有最高优先级的元素、查看具有最高优先级的元素等。实现优先级队列的常见算法包括插入时的堆调整、移除最高优先级元素后的堆调整等。

        2.0 用数组实现优先级队列

        可以使用数组来实现优先级队列,一种简单的实现方式是使用数组来存储元素,并且按照优先级顺序来维护数组。

        用数组实现优先级队列可分为两种:无序数组实现有序数组实现。

        3.0 无序数组实现优先级队列

        可以直接简单粗暴来说,无序数组就是插入元素的时候不按照优先级进行排序,而出队列的时候,严格按照优先级大小进行出队列

        首先,需要实现队列中的接口。比如:入队列、出队列等。

接口代码如下:

public interface Queue<E> {

    /**
     * 入队操作
     */
    boolean offer(E value);

    /**
     * 出队操作
     */
    E poll();

    /**
     * 查看队头元素
     */
    E peek();

    /**
     * 判断是否为空队列
     */
    boolean isEmpty();

    /**
     * 判断是否为满队列
     */
    boolean isFull();
}

        再接着,设置优先级元素

代码如下:

public interface Priority {

    int priority();

}
public class Entry implements  Priority{
    String string;
    int priority;

    public Entry(String string, int priority) {
        this.string = string;
        this.priority = priority;
    }

    @Override
    public int priority() {
        return priority;
    }

    @Override
    public String toString() {
        return "Entry{" +
                "string='" + string + '\'' +
                ", priority=" + priority +
                '}';
    }
}

        该设置的优先级元素需要实现 priority 接口,返回当前优先级的大小。

        成员变量有 Priority[] arr 自定义大小的数组、size 标记当前元素的个数。

代码如下:

public class UnorderedPriorityQueue<E extends Priority> implements Queue<E> {

    private Priority[] arr;
    private int size;

    public UnorderedPriorityQueue(int capacity) {
        arr = new Priority[capacity];
    }

}

        3.1 无序数组实现优先级队列 - 入队列 offer(E value)

        由于用无序数组实现,元素可直接在数组尾部入队列

代码如下:

    @Override
    public boolean offer(E value) {
        if (isFull()) {
            return false;
        }
        arr[size++] = value;
        return true;
    }

        注意:在入队前,需要判断是否为满队列。入队完后,需要进行 size++

        3.2 无序数组实现优先级队列 - 出队列 poll()

        根据元素的优先级大小进行出队列,首先需要遍历数组找到索引为 i 处优先级最大的元素。一般有两种情况:

        第一种情况:在索引为 i == size - 1 处找到优先级最大的元素,此时只需要将 size-- ,然后将其引用置为空 arr[size] = null

        第二种情况:不在索引为 i !=  size - 1 处找到优先级最大的元素。那么需要将索引为 i 的元素被 i + 1 处的元素进行覆盖,长度为:size - 1 - i

代码如下:

    @Override
    public E poll() {
        if (isEmpty()) {
            return null;
        }
        //先找到优先级大的点
        int j = 0;
        for (int i = 1; i < size; i++) {
            if (arr[j].priority() < arr[i].priority()) {
                j = i;
            }
        }
        E ret = (E)arr[j];
        if (j < size - 1) {
            System.arraycopy(arr,j+1,arr,j,size - 1 - j);
        }
        size--;
        arr[size] = null;
        return ret;
    }

        最后需要返回优先级最大的元素,在被置为 null 之前将其进行保存。每次出队完毕,后需要进行 size-- 、置为 null

        3.3 无序数组实现优先级队列 - 查看队列中优先级最大的元素 peek() 

        相比与出队列,找到了优先级最大的元素后,不需要进行删除该优先级最大的元素

代码如下:

    @Override
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        //先找到优先级大的点
        int j = 0;
        for (int i = 1; i < size; i++) {
            if (arr[j].priority() < arr[i].priority()) {
                j = i;
            }
        }
        E ret = (E)arr[j];
        return ret;
    }

        注意:在查看元素之前需要先判断是否为空队列。

        3.4 无序数组实现优先级队列 - 判断是否为空队列

        若 size == 0 ,则为空队列;若不是,则不为空。

代码如下:

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

        3.5 无序数组实现优先级队列 - 判断是否为满队列

        若 size == arr.length 时,则为满队列;若不相等,则不为满。

代码如下:

    @Override
    public boolean isFull() {
        return size == arr.length;
    }

        3.6 无序数组实现优先级队列完整代码

public class UnorderedPriorityQueue<E extends Priority> implements Queue<E> {

    private Priority[] arr;
    private int size;

    public UnorderedPriorityQueue(int capacity) {
        arr = new Priority[capacity];
    }

    @Override
    public boolean offer(E value) {
        if (isFull()) {
            return false;
        }
        arr[size++] = value;
        return true;
    }

    @Override
    public E poll() {
        if (isEmpty()) {
            return null;
        }
        //先找到优先级大的点
        int j = 0;
        for (int i = 1; i < size; i++) {
            if (arr[j].priority() < arr[i].priority()) {
                j = i;
            }
        }
        E ret = (E)arr[j];
        if (j < size - 1) {
            System.arraycopy(arr,j+1,arr,j,size - 1 - j);
        }
        size--;
        arr[size] = null;
        return ret;
    }

    @Override
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        //先找到优先级大的点
        int j = 0;
        for (int i = 1; i < size; i++) {
            if (arr[j].priority() < arr[i].priority()) {
                j = i;
            }
        }
        E ret = (E)arr[j];
        return ret;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public boolean isFull() {
        return size == arr.length;
    }
}

        4.0 有序数组实现优先级队列

        相对于无序数组优先级队列来说,有序数组实现优先级队列入队列操作需要按照优先级大小进行插入,而出队列操作直接在索引为 size - 1 处直接获取该最大优先级元素

        首先,同样的,需要实现队列中的接口。比如:入队列、出队列等。

接口代码如下:

public interface Queue<E> {

    /**
     * 入队操作
     */
    boolean offer(E value);

    /**
     * 出队操作
     */
    E poll();

    /**
     * 查看队头元素
     */
    E peek();

    /**
     * 判断是否为空队列
     */
    boolean isEmpty();

    /**
     * 判断是否为满队列
     */
    boolean isFull();
}

        再接着,设置优先级元素。

代码如下:

public class Entry implements  Priority{
    String string;
    int priority;

    public Entry(String string, int priority) {
        this.string = string;
        this.priority = priority;
    }

    @Override
    public int priority() {
        return priority;
    }

    @Override
    public String toString() {
        return "Entry{" +
                "string='" + string + '\'' +
                ", priority=" + priority +
                '}';
    }
}

        成员变量有 Priority[] arr 自定义大小的数组、size 标记当前元素的个数。

代码如下:

public class OrderedPriorityQueue<E extends Priority> implements Queue<E>{

    private Priority[] arr;
    private int size;

    public OrderedPriorityQueue(int capacity) {
        arr = new Priority[capacity];
    }

}

        4.1 有序数组实现优先级队列 - 入队列 offer(E value)

        使用有序数组实现优先级入队列,在入队列之前从后往前遍历数组,找到优先级小于入队列的元素优先级,找到即可插入其中

代码如下:

    @Override
    public boolean offer(E value) {
        if (isFull()) {
            return false;
        }
        //先找到优先级比value的优先级大的索引
        int i = size - 1;
        while (i >= 0 && arr[i].priority() > value.priority()) {
            arr[i+1] = arr[i];
            i--;
        }
        arr[i+1] = value;
        size++;
        return true;
    }

        考虑一种情况,若 size == 0 时,为空队列的时候,该代码有无错误?

                答案是:没有问题的,当 size == 0 时, 则 i = 0 - 1,i = -1 , 此时不会进入循环直接跳到 arr[i + 1] 处,所以,在这种情况下,该代码没有问题

        4.2 有序数组实现有序队列 - 出队列 poll()

        这就相对于有序数组入队列来说比较简单了,直接在索引为 i = size - 1 处,得到优先级最大的元素,然后将 size-- ,再接着 arr[size] 置为 null

代码如下:

    @Override
    public E poll() {
        if (isEmpty()) {
            return null;
        }
        E str = (E)arr[size - 1];
        size--;
        arr[size] = null;
        return str;
    }

        注意:需要记录优先级最大的元素并且返回。在出队列之前需要判断该队列是否为空队列。

        4.3 有序数组实现有序队列 - 查看优先级最大的元素 peek()

        先判断该队列是否为空队列,若不是,直接返回该数组索引为 size - 1 处的元素即可

代码如下:

    @Override
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        E str = (E)arr[size - 1];
        return str;
    }

        4.4 有序数组实现优先级队列 - 判断队列是否为空

        若 size == 0 ,则为空;若不为,则为不空。

代码如下:

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

        4.5 有序数组实现优先级队列 - 判断队列是否为满队列

        若 size == arr.length 时,则为满队列;若不是,则为不满队列。

代码如下:

    @Override
    public boolean isFull() {
        return size == arr.length;
    }

        4.6 有序数组实现优先级队列完整代码

public class OrderedPriorityQueue<E extends Priority> implements Queue<E>{

    private Priority[] arr;
    private int size;

    public OrderedPriorityQueue(int capacity) {
        arr = new Priority[capacity];
    }

    @Override
    public boolean offer(E value) {
        if (isFull()) {
            return false;
        }
        //先找到优先级比value的优先级大的索引
        int i = size - 1;
        while (i >= 0 && arr[i].priority() > value.priority()) {
            arr[i+1] = arr[i];
            i--;
        }
        arr[i+1] = value;
        size++;
        return true;
    }

    @Override
    public E poll() {
        if (isEmpty()) {
            return null;
        }
        E str = (E)arr[size - 1];
        size--;
        arr[size] = null;
        return str;
    }

    @Override
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        E str = (E)arr[size - 1];
        return str;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public boolean isFull() {
        return size == arr.length;
    }
}

        5.0 大顶堆实现优先级队列

        大顶堆说明:

        大顶堆是一种特殊的堆,它是一种完全二叉树,其中每个父节点的值都大于或等于其左右子节点的值。在大顶堆中,根节点的值是整个堆中最大的。

        大顶堆可以使用数组来实现,其中堆的根节点存储在数组的第一个位置,然后按照完全二叉树的性质依次存储其他节点。这种实现方式使得大顶堆的父节点和子节点之间可以通过简单的数学关系来计算,从而方便进行堆调整操作。假设 i 不为 0 ,该双亲索引为:(i - 1)/ 2 ;该左孩子为:2 * i + 1;该右孩子为:2 * i  + 2 。

        首先,需要实现队列中的接口。比如:入队列、出队列等。

接口代码如下:

public interface Queue<E> {

    /**
     * 入队操作
     */
    boolean offer(E value);

    /**
     * 出队操作
     */
    E poll();

    /**
     * 查看队头元素
     */
    E peek();

    /**
     * 判断是否为空队列
     */
    boolean isEmpty();

    /**
     * 判断是否为满队列
     * */
    boolean isFull();
}

         再接着,设置优先级元素。

代码如下:

public class Entry implements  Priority{
    String string;
    int priority;

    public Entry(String string, int priority) {
        this.string = string;
        this.priority = priority;
    }

    @Override
    public int priority() {
        return priority;
    }

    @Override
    public String toString() {
        return "Entry{" +
                "string='" + string + '\'' +
                ", priority=" + priority +
                '}';
    }
}

        成员变量有 Priority[] arr 自定义大小的数组、size 标记当前元素的个数。

代码如下:

public class BigTopPile<E extends Priority> implements Queue<E> {

    private Priority[] arr;
    private int size;

    public BigTopPile(int capacity) {
        arr = new Priority[capacity];
    }

}

        5.1 堆实现优先级队列 - 入队列 offer(E value)

        具体思路为:由于是按照优先级大小来存放元素的,所以,需要先比较优先级大小,在适合的位置插入。现在已知 i = size,该双亲为:(i - 1)/ 2 。接下来,需要判断 arr[(i - 1)/ 2] 的优先级于入队列的元素优先级大小,若 arr[(i - 1)/ 2] 的优先级较大,此时该入队列的元素存放的位置为 arr[i] = value ;若 value 的优先级大于当前 arr[(i - 1)/ 2] 时,先将当前 arr[(i - 1)/ 2] 往后放,即 arr[i] = arr[(i - 1)/ 2] 。之后需要继续往上找双亲,将 i = (i - 1) / 2 ,直到 i == 0 或者 value 的优先级小于当前 arr[(i - 1)/ 2] 时,则为 arr[i] = value

代码如下:

    @Override
    public boolean offer(E value) {
        if (isFull()) {
            return false;
        }
        int i = size;
        int j = (i - 1) / 2;
        while (i > 0 && arr[j].priority() < value.priority()) {
            arr[i] = arr[j];
            i = j;
            j = (i - 1) / 2;
        }
        arr[i] = value;
        size++;
        return true;
    }

        只要 i == 0 时, j 不能继续往上走了,否则为抛空指针异常。

        5.2 堆实现优先级队列 - 出队列 poll()

        具体思路为:分为两步。

        第一步,将 arr[size - 1] 处的元素交换到 arr[0] 处

        第二步,由于根处的优先级永远都要大于该孩子的优先级,所以,将交换之后的元素进行下潜,即先找到该左右孩子优先级最大的元素,于根元素进行交换,一直往下进行下潜。直到该根元素没有左右孩子或者根元素的优先级都大于该左右孩子的优先级

代码实现:

非递归实现:

    @Override
    public E poll() {
        if (isEmpty()) {
            return null;
        }

        E top = (E)arr[0];
        arr[0] = arr[size - 1];
        size--;
        arr[size] = null;
        int i = 0;
        while ( (i * 2 + 1) < size && (i * 2 + 2) < size && (arr[i].priority() < arr[i * 2 + 1].priority() || arr[i].priority() < arr[i * 2 + 2].priority() ) ) {

            int j = 0;
            if (arr[i * 2 + 1].priority() > arr[i * 2 + 2].priority()) {
                j = i * 2 + 1;
            }else if (arr[i * 2 + 1].priority() <= arr[i * 2 + 2].priority()) {
                j = i * 2 + 2;
            }
            E temp = (E)arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
            i = j;
        }
        return top;
    }

         (i * 2 + 1) < size && (i * 2 + 2) < size 该代码判断的是有无左右孩子元素。

递归实现:

    public E poll1() {
        if (isEmpty()) {
            return null;
        }
        //交换头尾
        swap(0,size - 1);
        size--;
        //置为 null
        E ret = (E)arr[size];
        arr[size] = null;

        //下潜
        down(0);
        return ret;

    }
    private void swap(int i, int j) {
        E t = (E)arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
    private void down(int i) {
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int max = i;
        if ( left < size && arr[max].priority() < arr[left].priority()) {
            max = left;
        }
        if (right < size && arr[max].priority() < arr[right].priority()) {
            max = right;
        }
        if (max != i) {
            swap(max,i);
            down(max);
        }
    }

        

        5.3 堆实现优先级队列 - 查看优先级最大的元素 peek()

        先判断该队列是否为空,若不为空,则直接返回堆顶元素即可。

代码如下:

    @Override
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        return (E)arr[0];
    }

         5.4 堆实现优先级队列 - 判断该队列是否为空

        当 size == 0 时,则为空队列。

代码实现:

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

        5.5 堆实现优先级队列 - 判断该队列是否为满队列

        当 size == arr.length 时,则为满队列。

代码实现:

    @Override
    public boolean isFull() {
        return size == arr.length;
    }

        5.6 堆实现优先级队列完整代码

public class BigTopPile<E extends Priority> implements Queue<E> {

    private Priority[] arr;
    private int size;

    public BigTopPile(int capacity) {
        arr = new Priority[capacity];
    }

    @Override
    public boolean offer(E value) {
        if (isFull()) {
            return false;
        }
        int i = size;
        int j = (i - 1) / 2;
        while (i > 0 && arr[j].priority() < value.priority()) {
            arr[i] = arr[j];
            i = j;
            j = (i - 1) / 2;
        }
        arr[i] = value;
        size++;
        return true;
    }

    @Override
    public E poll() {
        if (isEmpty()) {
            return null;
        }

        E top = (E)arr[0];
        arr[0] = arr[size - 1];
        size--;
        arr[size] = null;
        int i = 0;
        while ( (i * 2 + 1) < size && (i * 2 + 2) < size && (arr[i].priority() < arr[i * 2 + 1].priority() || arr[i].priority() < arr[i * 2 + 2].priority() ) ) {

            int j = 0;
            if (arr[i * 2 + 1].priority() > arr[i * 2 + 2].priority()) {
                j = i * 2 + 1;
            }else if (arr[i * 2 + 1].priority() <= arr[i * 2 + 2].priority()) {
                j = i * 2 + 2;
            }
            E temp = (E)arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
            i = j;
        }
        return top;
    }

    public E poll1() {
        if (isEmpty()) {
            return null;
        }
        //交换头尾
        swap(0,size - 1);
        size--;
        //置为 null
        E ret = (E)arr[size];
        arr[size] = null;

        //下潜
        down(0);
        return ret;

    }
    private void swap(int i, int j) {
        E t = (E)arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
    private void down(int i) {
        int left = 2 * i + 1;
        int right = 2 * i + 2;
        int max = i;
        if ( left < size && arr[max].priority() < arr[left].priority()) {
            max = left;
        }
        if (right < size && arr[max].priority() < arr[right].priority()) {
            max = right;
        }
        if (max != i) {
            swap(max,i);
            down(max);
        }
    }



    @Override
    public E peek() {
        if (isEmpty()) {
            return null;
        }
        return (E)arr[0];
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public boolean isFull() {
        return size == arr.length;
    }
}

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

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

相关文章

RocketMQ可视化工具 打包遇到的yarn intall 问题

文章目录 RocketMQ可视化工具1.github上下载2.修改参数3.运行4.打包5.出错6.解决7.重试8.再解决9.很奇怪运行没错&#xff0c;但是测试错啦10.不想深究&#xff0c;直接跳过测试11.展示成功 RocketMQ可视化工具 1.github上下载 下载地址 https://github.com/apache/rocketmq-…

深度学习的目标检测算法综述

信息记录材料 2022年10月 第23卷第10期 【摘要】目标检测是深度学习的一个重要应用&#xff0c;目前在智能驾驶、工业检测相关领域都获得应用&#xff0c;具有重要的现实意义。本文对基于深度学习目标检测算法原理和应用情况进行简述&#xff0c;首先介绍结合区域提取和卷积神经…

Corona最新渲染器Corona11详解,附送下载地址

近日&#xff0c;Corona进行了大版本更新&#xff0c;发布了最新的Corona11。这次更新&#xff0c;包含众多新功能和新修复&#xff0c;借助 Corona 11 用户可将作品提升到更高的创作水准&#xff0c;更真实可感的视觉水平。 那么更新了那些呢&#xff1f;一起来看看吧&#x…

深度学习学习顺序梳理

https://www.bilibili.com/video/BV1to4y1G7xq/?spm_id_from333.999.0.0&vd_source9607a6d9d829b667f8f0ccaaaa142fcb 1.吴恩达机器学习课程 已学完&#xff0c;时间较久了&#xff0c;后续可以重新听一遍&#xff0c;整理一下笔记 2. 白板推导读西瓜书 统计学习方法看…

当你打开终端并输入命令时会发生什么?(上)

哈喽大家好&#xff0c;我是咸鱼 参加过校招面试的小伙伴们肯定对下面这道面试题很熟悉&#xff1a;“当你在浏览器输入一段网址后会发生什么&#xff1f;”。这道面试题可以说是很经典了&#xff0c;因为其涉及大量网络协议&#xff0c;可以非常直观的看出小伙伴们对计算机网…

光栅化渲染:光栅化算法实现

光栅化是将图元转换为二维图像的过程。 该图像的每个点都包含颜色和深度等信息。 因此&#xff0c;对图元进行光栅化由两部分组成。 第一个是确定窗口坐标中整数网格的哪些方格被图元占据。 第二个是为每个这样的方块分配颜色和深度值。 &#xff08;OpenGL 规范&#xff09; N…

C++1114新标准——统一初始化(Uniform Initialization)、Initializer_list(初始化列表)、explicit

系列文章目录 C11&14新标准——Variadic templates&#xff08;数量不定的模板参数&#xff09; C11&14新标准——Uniform Initialization&#xff08;统一初始化&#xff09;、Initializer_list&#xff08;初始化列表&#xff09;、explicit 文章目录 系列文章目录1…

Unity_使用FairyGUI搭建登录页面

Unity_使用FairyGUI搭建登录页面 1. 使用FairyGUI准备一个UI界面&#xff0c;例如&#xff1a;以下登录 2. 发布导出&#xff08;发布路径设置为Unity的Asset下任何路径&#xff09; 3. Unity编辑器安装FairyGUI包资源&#xff08;在资源商店找见并存储为我的资源&#xff0c;…

管理的五大过程和十大知识领域

PMBOK五大过程组是什么&#xff1f; PMBOK五大过程组是&#xff1a;启动过程、规划过程、执行过程、监控过程、收尾过程。 各用一句话概括项目管理知识体系五大过程组&#xff1a; 1、启动过程组&#xff1a;作用是设定项目目标&#xff0c;让项目团队有事可做&#xff1b; 2、…

TIGRE: a MATLAB-GPU toolbox for CBCT image reconstruction

TIGRE: 用于CBCT图像重建的MATLAB-GPU工具箱 论文链接&#xff1a;https://iopscience.iop.org/article/10.1088/2057-1976/2/5/055010 项目链接&#xff1a;https://github.com/CERN/TIGRE Abstract 本文介绍了基于层析迭代GPU的重建(TIGRE)工具箱&#xff0c;这是一个用于…

因光而遇·领杭设计,Yeelight易来设计师梦享会在杭州成功举办

12月13日&#xff0c;Yeelight易来设计师梦享会“因光而遇领杭设计”在杭州举办。本次活动邀请《梦想改造家》设计师朱晓鸣参与&#xff0c;与众多易来照明设计师进行了深入对话&#xff0c;分享前沿的设计理念&#xff0c;探讨智能灯光在家装设计中的应用。 易来品牌总监李田…

算法:最长公共前缀(横向扫描和纵向扫描)

横向扫描 时间复杂度 O(m * n)&#xff0c;空间复杂度O(1) /*** param {string[]} strs* return {string}*/ var longestCommonPrefix function(strs) {// 先把第一个字符串拿出来let str strs[0]// 用 startsWith 检查数组中每个字符串是否以当前字符串为前缀while(!strs.e…

高精度电压源的作用是什么

高精度电压源是一种用于提供稳定和精确电压输出的电子设备。它们在实验室研究、工业生产和医疗器械等各种应用中发挥着重要作用。下面西安安泰来为大家详细介绍高精度电压源的作用和用途等内容。 一、高精度电压源的作用 提供准确的电压值&#xff1a;高精度电压源可以提供非常…

银河麒麟重置密码

桌面版银河麒麟重置密码 1.选择界面按e 出现银河麒麟系统选择的页面&#xff0c;我们点击键盘上的“e”键&#xff0c;进入电脑启动项编辑页 2.编辑启动页 在启动项编辑页面&#xff0c;我们将光标移动到linux这一行的最后&#xff0c;然后输入“init/bin/bash consoletty0”…

图片怎么去文字水印?分享三个简单无痕方法

图片怎么去文字水印&#xff1f;大家在遇到好看的图片时&#xff0c;是否曾想过将其用作自己的头像&#xff1f;然而&#xff0c;很多时候从网上保存的图片会带有平台或作者的水印&#xff0c;这会严重影响头像的整体视觉效果&#xff0c;导致我们不得不放弃使用这张图片&#…

雪花算法详细讲解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 背景一、介绍二、结构三、数据库分表1.垂直分表2.水平分表&#xff08;1&#xff09;主键自增&#xff08;2&#xff09;取模&#xff08;3&#xff09;雪花算法&am…

【Linux】探索Linux进程优先级 | 环境变量 |本地变量 | 内建命令

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 目录 一、进程优先级1.1优先级VS权限1.2为什么要有进程优先级&am…

springboot098基于web的网上摄影工作室的开发与实现

springboot098基于web的网上摄影工作室的开发与实现 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

HarmonyOS4.0从零开始的开发教程12给您的应用添加弹窗

HarmonyOS&#xff08;十&#xff09;给您的应用添加弹窗 概述 在我们日常使用应用的时候&#xff0c;可能会进行一些敏感的操作&#xff0c;比如删除联系人&#xff0c;这时候我们给应用添加弹窗来提示用户是否需要执行该操作&#xff0c;如下图所示&#xff1a; 弹窗是一种…

3分钟,掌握“曲面屏显示屏”

在3分钟内掌握“曲面屏显示屏”的概念和特点&#xff0c;可以按照以下步骤进行&#xff1a; 一、了解曲面屏显示屏的基本概念 曲面屏显示屏是一种采用柔性塑料的显示屏&#xff0c;主要通过OLED面板来实现。相比直面屏幕&#xff0c;曲面屏幕弹性更好&#xff0c;不易破碎。此外…