【LeetCode刷题篇零】一些基础算法知识和前置技能(上)

news2024/12/23 11:03:43

排序算法

O(N^2)的排序算法:冒泡、选择、插入

冒泡排序

在这里插入图片描述

冒泡的核心是两两比较,大数下沉,小数上浮,比较的轮数是数组的长度 N,每一轮比较的次数为 N - 当前轮的索引:

  • 外层循环控制轮数 round: [1,N]
  • 内层循环控制次数 i: [0,N - round)

在每一轮当中,内循环中两两比较相邻的两个数,大数下沉(交换),如果某一轮没有发生交换操作,则可以提前终止。

代码如下:

在这里插入图片描述

冒泡排序的特点:

  • 时间复杂度是 O(N^2)
  • 空间复杂度是 O(1),是原地排序算法
  • 冒泡排序是稳定的排序算法

这里的稳定是因为相等的元素不会做交换操作

在这里插入图片描述

选择排序

选择排序的做法是首先从剩余元素中选择一个最小的数与未排序的第一个元素进行交换:

在这里插入图片描述

接着再从剩余元素中选择一个最小的元素进行交换:

在这里插入图片描述

  • 外层循环 i: [0,N)
  • 内层循环 j: [i+1, N)

设当前 i 位置值为最小值,内层循环找到最小的数,记住下标,跟当前 i 位置进行交换。

代码如下:

在这里插入图片描述

选择排序的特点:

  • 时间复杂度是 O(N^2)
  • 空间复杂度是 O(1),是原地排序算法
  • 选择排序是不稳定的排序算法

插入排序

每次从数组的无序区间中取一个元素插入到有序的区间中:

在这里插入图片描述

  • 外层循环 i: [1,N)
  • 内层循环 j: [i,0)

内层循环中将当前元素跟前一个元素比较,如果比前一个小就交换,否则结束内层循环。

代码如下:

在这里插入图片描述

这个代码还可以继续优化一下,我们可以先记住待插入的元素,然后让 ji 位置往前寻找到合适的位置再插入。在寻找的过程中直接将前面的元素往后面位置覆盖,因为我们记住了一个元素,相当于留出了一个坑位,因此可以前面的元素依次往后挪一个位置,直到找到可插入位置为止。

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

外层先记住当前的 i 位置的值 tmp,内层每次看 j - 1 位置的数,如果比tmp大的就直接将 j - 1 位置覆盖到 j 位置,如果比tmp小,就结束内层循环,将tmp覆盖到 j 位置。

优化后的代码如下:

在这里插入图片描述

这个代码省略了交换操作,做到了原地交换

插入排序的特点:

  • 时间复杂度是 O(N^2)
  • 空间复杂度是 O(1),是原地排序算法
  • 插入排序是稳定的排序算法

O(N^2) 的排序算法性能比较:插入排序 > 选择排序 > 冒泡排序,插入排序性能最好,冒泡排序性能最差。

但是在LeetCode刷题的过程中,很少会用到O(N^2) 的排序算法,因为效率比较低,作为了解即可。

希尔排序

希尔排序的核心思想是先使部分有序,最后让整体有序。

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

这里递增序列也叫做步长,步长的计算公式有很多种,参见下表:

在这里插入图片描述

其中 k=1,2,3,4,5,6…N是数组长度。下面是选择步长公式为 (3^k - 1) / 2 的参考代码:

在这里插入图片描述

希尔排序的特点:

  • 空间复杂度是 O(1),是原地排序算法
  • 希尔排序是不稳定的排序算法

希尔排序的时间复杂度跟所选择的步长计算公式有关:

在这里插入图片描述

选择步长公式为 (3^k - 1) / 2 的时间复杂度是 O(n^3/2),而选择其他步长公式最差可以是 O(n^2)

在大规模乱序数组情况下,希尔排序优于插入排序。

O(NlogN)的排序算法:快排、 归并

快速排序

快排核心思想:选择数组中任一个数字作为分区点,小的放左边,大的放右边

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

快排按照分区点的选择方式不同,我整理的有两种版本的代码:

第一种:以最右边的元素作为分区点的分区逻辑(快慢指针)

在这里插入图片描述

注意,这里的partition方法中一定要使用Random.nextInt函数随机生成分区点,这点对快排的效率至关重要,如果不是随机的,快排的效率会降低。在生成随机分区点以后,需要将该位置交换到数组的最右边,主要是为了接下来的快慢指针扫描过程方便,并且在扫描处理完毕后,记得需要将分区点交换回slow位置并返回slow

第二种:以最左边元素为分区点的分区逻辑(挖坑法)

在这里插入图片描述

这种方法同样是需要先使用Random.nextInt函数随机生成分区点,然后交换到最左边,并且最后记得将分区点元素放入nums[L]中,返回的是 L

这两种划分方式并不是真的直接选择最右边或最左边的元素作为分区点,而是要先使用随机函数随机生成分区点,只是它们处理分区逻辑的方式不同。

快排在刷题过程中会使用到的频率较高,所以以上代码模版务必牢记,如果你更喜欢快慢指针可以选择第一种,否则可选择第二种。但是第一种更容易扩展三路快排的代码模板。

快速排序的特点:

  • 时间复杂度是 O(n*logn)
  • 空间复杂度是 O(logn),是原地排序算法
  • 快速排序是不稳定的排序算法

注意:并不是所有原地排序算法的空间复杂度一定就是O(1),而空间复杂度是O(1)的排序算法则一定是原地排序算法。

归并排序

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

代码如下:

在这里插入图片描述

这个代码,关键是理解递归调用中最后合并两个有序数组的部分,需要用额外数组暂存,然后在比较的时候是到暂存的temp数组中比较,谁小就取谁,直接覆盖到原数组对应位置,如果有一个到头了则取另一个剩下的全部。

归并排序的特点:

  • 时间复杂度是 O(n*logn)
  • 空间复杂度是 O(n)不是原地排序算法
  • 归并排序是稳定的排序算法

理解分治算法思想

分治算法(divide and conquer)的核心思想就是:分而治之

分治算法思想的描述:将一个规模较大的原问题划分成若干个规模较小的子问题,这些子问题的结构与原问题是相似的,子问题的求解方式和原问题的求解方式也是一样的,解决了这些子问题,然后再合并它们的结果,这样原问题就得到了解决。

从上面的分治算法的描述来看,分治算法和递归是有点类似的,实际上,分治算法是一种处理问题的思想,而递归是一种编程技巧。分治一般比较适合使用递归来实现。归并排序算法其实就是分治算法,也是使用递归来实现的。

在使用递归实现分治算法中,每一层递归其实包含三个操作:

  1. 拆解:将原问题拆解成若干个问题
  2. 解决:递归地求解各个子问题,直到最小子问题解决
  3. 合并:将子问题的结果合并起来,这样,原问题就解决了

分治算法能解决的问题,一般需要满足下面的几个条件:

  1. 原问题与拆分的子问题具有相同的结构
  2. 原问题拆解的子问题可以独立求解,子问题之间没有相关性
  3. 存在最优最小子问题的解
  4. 子问题解的结果可以合并,合并后的结构就是原问题的结果

前面的归并排序算法、快速排序算法都是分治算法思想的体现。这两种排序算法在LeetCode刷题过程中也会经常用到,因此需要重点掌握。

O(N)的排序算法:桶排序、计数排序、基数排序

桶排序

先根据数组最大值划分成若干桶,然后桶内元素进行排序,最后将桶的元素进行合并。

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

代码如下:

在这里插入图片描述
这里桶内排序算法最好选择 O(nlogn) 的算法,如快排。

桶排序的时间复杂度分析:

在这里插入图片描述

也就是说,n 个元素分配到 m 个桶中,只有当 m 与 n 比较接近的时候才是线性时间复杂度O(N)

桶排序的特点:

  • 空间复杂度是O(m),m 表示桶的个数,不是原地排序算法
  • 桶排序是不是稳定排序算法取决于对桶内元素排序的算法
  • 桶排序对数据要求非常苛刻:
    1. 桶与桶之间必须是有序的
    2. 待排序数据最好均匀的分配到每个桶中

计数排序

计数排序本质上是桶排序,桶的个数是数组中的最大值。

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

计数排序的主要步骤:

  1. 计数
  2. 计数累加
  3. 根据计数数组计算每个元素的输出位置

代码如下:

在这里插入图片描述

计数排序的特点:

  • 时间复杂度是 O(n + k),k 表示数组元素的最大范围
  • 空间复杂度是 O(n)不是原地排序算法
  • 计数排序是稳定的排序算法(但只有计算输出位置时倒序遍历才是稳定的,否则是不稳定的)

计数排序只能用在数据范围不大的场景中,如果数据范围k比排序的数据n大很多,就不适合用计数排序了。

基数排序

基数排序的本质就是对数据的每一位进行计数排序。

使用基数排序有几个要求:

  1. 必须是稳定的排序算法
  2. 数据范围不大,如0~9
  3. 必须是线性时间复杂度O(N)的算法

在这里插入图片描述

代码如下:

在这里插入图片描述

基数排序的特点:

  • 时间复杂度是 O(Cn),C 表示最大值的位数,可以省略
  • 空间复杂度是 O(n)不是原地排序算法
  • 基数排序是稳定的排序算法(但只有计算输出位置时倒序遍历才是稳定的,否则是不稳定的)

基数排序对要排序的数据是有要求的:

  • 需要可以分割出来独立的“位”来比较,而且每一位的数据范围不能太大

  • 要可以用线性排序算法来排序,否则基数排序的时间复杂度就无法做到O(n)了

不同排序算法的比较和选择

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

排序算法总结

  • 1)不基于比较的排序,对样本数据有严格要求,不易改写
  • 2)基于比较的排序,只要规定好两个样本怎么比大小就可以直接复用
  • 3)基于比较的排序,时间复杂度的极限是O(N*logN)
  • 4)时间复杂度O(N*logN)、额外空间复杂度低于O(N)、且稳定的基于比较的排序是不存在的。
  • 5)为了绝对的速度选快排、为了省空间选堆排、为了稳定性选归并

O(N^2)排序算法的选择:

  1. 插入排序性能最好、其次是选择排序、冒泡排序性能最差
  2. 选择排序不是稳定的排序算法
  3. 插入排序是最好的选择
  4. 对于大规模的乱序数组的排序,可以使用希尔排序

O(NlogN)排序算法的选择:

  1. 快排时间复杂度最坏情况下是O(N^2),合理选择分区点
  2. 归并排序在任何情况下的时间复杂度都是O(NlogN)
  3. 归并排序的空间复杂度是O(N),快排空间复杂度是O(logN)
  4. 但是快排不是稳定的排序算法,归并是稳定的排序算法

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

Java内置排序算法

Arrays.sort(int[] data)

该方法的内部实现细节区别:

  1. 对于小数据量(小于47)的话使用插入排序
  2. 然后小数据量(大于47而小于286)的话使用递归实现的快速排序
  3. 对于大数据量使用迭代(自底朝上)实现的归并排序

Java内置的引用类型的排序方法:

  1. Arrays.sort(Object[] data)
  2. Arrays.sort(T[] data, Comparator< T > c),内部实现细节:对于小规模数据使用插入排序,大规模数据使用归并排序

Arrays.sort(Object[] data) 这种要求对象实现Comparable接口

在这里插入图片描述
Collections.sort() 底层是基于 Arrays.sort() 实现的,同样有两个方法。

Comparable的使用:

在这里插入图片描述

或者直接下面这样写:

在这里插入图片描述

使用:

在这里插入图片描述

Comparator的使用:

在这里插入图片描述

在刷题当中实际使用更多的是匿名内部类和lambda箭头的写法:

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

前面提到的所有基础的排序算法,如快排,如果想比较对象的话,可以实现上面的接口,将比较大小的地方换成对应接口的方法即可。

查找算法

在这里插入图片描述

二分查找

在这里插入图片描述

上面代码中有两点需要注意:

  1. while循环的退出条件是 L <= R,当 left == right 只有一个元素的时候仍然需要执行循环体, 因此退出条件是 left <= right
  2. 当数组长度为偶数的时候,默认 mid = left + (right - left) / 2 计算得到的默认是中间靠左边的位置,可以通过 mid = left + (right - left + 1) / 2 得到中间靠右的位置。

二分查找的时间复杂度是O(logn)。

使用排除区间法实现二分查找

思路是在循环体内排除一定不会出现目标的区间,left==right 时跳出循环体,此时只剩下一个元素,可能是目标。

在这里插入图片描述

哈希查找

刷题时需要用到的时间复杂度 O(1) 的两种哈希数据结构:

在这里插入图片描述

还有一种是使用数组代替哈希结构,如建立长度与a-z相等的长度为26int数组来统计次数。

Set 和 Map

动态数组实现的Set比链表实现的Set的contains操作性能好的原因:

  • 数组是一块连续的内存空间,在 cpu 读取数组中的一个元素的时候,会将这个元素旁边的多个元素一起加载进 cpu 的高速缓存,这样下次读取的话,就直接从高速缓存中读取。

  • 链表的数据是分散在内存中的,cpu 每次读取元素的时候都需要从主存中读取,所以数组的顺序遍历会比链表的顺序遍历要快。

最简单的哈希方法就是使用 hashCode % 数组的长度

哈希冲突解决 - 开放寻址法

从冲突的位置开始往后找到第一个空的位置插入

在这里插入图片描述

哈希冲突解决 - 链表法

在冲突的位置生成一个链表存储冲突的元素,冲突元素插入到链表的表尾。

在这里插入图片描述

装载因子

当数组中空余位置不多时,冲突概率会大大增加,引入装载因子增加剩余空间,可以减少冲突概率。当空间大小超过装载因子x数组长度时,就进行扩容而不是等于数组长度时才扩容。

Java内置的Set和Map

在这里插入图片描述
Java有序表的实现:TreeMap 和 TreeSet

  • TreeMap implements SortedMap
  • TreeSet implements SotredSet

TreeMap 的使用:

在这里插入图片描述

TreeMap的方法:

  • TreeMap.firstKey():返回最小的key
  • TreeMap.lastKey():返回最大的key
  • TreeMap.floorKey(X):返回小于等于X的最大的key
  • TreeMap.ceilingKey(X):返回大于等于X的最小的key
  • TreeMap.lowerKey(X):返回小于X的最大的key
  • TreeMap.higherKey(X):返回大于X的最小的key

TreeSet的方法:

  • TreeSet.first() 返回最小的值
  • TreeSet.last() 返回最大的值
  • TreeSet.floor(X):返回小于等于X的最大元素
  • TreeSet.ceiling(X):返回大于等于X的最小元素
  • TreeSet.lower(X):返回小于X的最大元素
  • TreeSet.higher(X):返回大于X的最小元素

floor就是从下面找小于等于的上界,ceiling就是从上面找大于等于的下界,lower higher跟这俩差不多,没有等于。first就是找最小的,last就是找最大的。

在这里插入图片描述

栈和队列

在这里插入图片描述

Java内置的栈和队列数据结构

在这里插入图片描述

Deque接口继承了Queue接口,而Deque有两个实现类分别是 ArrayDequeLinkedList 这两个双端队列的实现类在刷题中会经常用到。

由于 add/remove 方法有可能抛出异常,所以最好使用 offer/poll 这一对方法来执行入队出队操作,如果是查看队首/栈顶元素一般是使用peek方法。对于双端队列而言,只不过多了带 xxxFirstxxxLast的方法以及 push/pop 方法。

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

使用双端队列作为栈使用也是刷题时高频使用的方法,因为双端队列最大的好处就是既可以当作队列使用,又可以当作栈使用。

另外有一点注意,双端队列实现中:ArrayDeque.addFirst()/addLast()/push() 等方法不能接受null元素,但是LinkedList的相关方法可以。

单调栈

单调栈就是指栈中的元素必须是按照升序排列的栈,或者是降序排列的栈。

在这里插入图片描述

单调递增栈

在这里插入图片描述

栈中一直维护比栈顶元素大的元素的索引,即比栈顶元素大就入栈索引,直到遇到比栈顶小的元素时,就出栈栈顶元素进行处理;并且此时是while循环比较栈顶元素,如果一直比栈顶小就持续出栈栈顶的元素进行处理。

在这里插入图片描述

注意,栈中存的是元素值对应的索引下标值。

单调递减栈

在这里插入图片描述

栈中一直维护比栈顶元素小的元素的索引,即比栈顶元素小就入栈索引,直到遇到比栈顶大的元素时,就出栈栈顶元素进行处理;并且此时是while循环比较栈顶元素,如果一直比栈顶大就持续出栈栈顶的元素进行处理。

在这里插入图片描述

二叉堆 优先级队列(PriorityQueue)

二叉堆是一棵完全二叉树,分为两大类:大顶堆和小顶堆。大顶堆中每个节点的值都满足小于父节点的值,根节点是整棵树中的最大值。而小顶堆则恰恰相反。

在这里插入图片描述

可以使用动态数组来存储大顶堆对应的完全二叉树。

在这里插入图片描述

大顶堆—添加元素 Shift Up

  • 新添加的元素添加到最后一个元素,然后不断跟父结点比较,父节点比它大的话就交换,不断上浮

大顶堆—删除堆顶元素 Shift Down

  • 先将最后一个元素直接替换掉堆顶的元素值,删除最后一个元素,然后不断将堆顶元素与左右子节点比较,与较大的子节点交换,如果子节点比它小就不交换,这样不断下沉

堆化

  • 将非叶子结点进行 Shift Down 操作

堆化时间复杂度为 O(n),二叉堆适合插入和查询都比较多的场景。

在这里插入图片描述

Java中内置的二插堆结构

Java 中的 PriorityQueue 优先级队列默认使用的是 小顶堆 的实现方式。我们可以通过自定义Comparator接口可以修改为 大顶堆 方式。

PriorityQueue 的使用:

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

二叉树

二叉树的存储

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

左子节点:data[2 * i + 1]
右子节点:data[2 * i + 2]
通过存储后的子节点可以找到父节点:(i - 1) / 2

如果将根节点存储在数组的第二个位置,可以更方便的计算子节点的父节点:i / 2

在这里插入图片描述

但是这样会浪费一个存储空间(第一个位置需要空着),并且如果是非完全二叉树的存储会浪费更多空间:

在这里插入图片描述

只有完全二叉树(或满二叉树)采用数组的存储方式才比较省内存(相对比于链表存储)

二叉树的遍历

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

DFS和BFS的合适解决方案:

  • DFS适合用栈,因为要记住之前的节点,而后去访问它。

  • BFS适合用队列,因为按层访问每一层是按先后顺序访问的。

在这里插入图片描述

二叉查找树

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

查找:与根节点比较,比根节点小就在左子树中,比根节点大就在右子树中

插入:与根节点比较,比根节点小就在左子树中插入,比根节点大就在右子树中插入

在这里插入图片描述

二叉查找树的时间复杂度:平均 O(logn) 最差 O(n)

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

平衡二叉树

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

AVL树

AVL树是一种平衡二叉树,AVL是两个人的名字。

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

高度差也称为平衡因子,如何计算平衡因子:

在这里插入图片描述

判断一棵树是否是二叉查找树:

  • 判断中序遍历的结果(数组)是否是升序的

判断一棵树是否是平衡二叉树:

  • 高度差小于1,递归左子树是平衡二叉树且右子树也是平衡二叉树

在这里插入图片描述

2-3查找树

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

红黑树

在这里插入图片描述

什么是红黑树

  1. 每个节点或者是红色,或者是黑色的
  2. 根节点是黑色的
  3. 每个叶子节点(最后的空节点)是黑色的
  4. 如果一个节点是红色的,那么他的孩子节点都是黑色的
  5. 从任意一个节点到叶子节点,经过的黑色节点都一样

红黑树类比2-3树:

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

红黑树主要是为了保持黑平衡,模拟2-3树

完全随机数据的情况下:插入操作 二叉查找树性能最好

有序的数据情况下:插入操作 红黑树比AVL树性能优,二叉查找树最差(退化成链表)

二叉查找树性能总结:

  • 对于完全随机的数据来说,普通的二叉查找树的性能很好

  • 普通的二叉查找树的缺点:在极端的情况下会退化成链表(或者高度不平衡)

  • 对于查询较多的情况,AVL树的性能很好

  • 红黑树牺牲了平衡性,它的高度为2logn,没有AVL平衡,但是红黑树的综合统计性能更优(综合增删改查所有的操作)

AVL树的查询性能较好,但是红黑树综合性能最好。

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

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

相关文章

Python之线程(二)

一、线程同步和互斥锁 同一个资源,多人想用?排队啊! 现实生活中,我们会遇到“同一个资源,多个人都想使用”的问题。 比如:教室里,只有一台电脑,多个人都想使用。天然的解决办法就是,在电脑旁边,大家排队。前一人使用完后,后一人再使用。再比如,上厕所排队。 二、线…

ABB机器人6700系列更换SMB电池的具体方法和步骤

ABB机器人6700系列更换SMB电池的具体方法和步骤 前提: 当需要更换电池时,会显示低电量警告“38213 Battery charge low(电池电量低)” 注意事项: 为了避免机器人不同步,在保持机器人控制柜上电的情况下进行电池的更换,否则可能会导致机器人丢失位置数据。 SMB电池的具体…

AP2813平均电流型双路降压恒流驱动器

产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功率管输出功率可达12W&#xff0c;电流 1.2A。AP2813 一路直亮&#xff0c;另外一路通过 MODE1 切换全亮&#xff0c;爆闪。AP281…

ERP辅助报价助力提高效率和准确性

一、ERP辅助报价的定义&#xff1a; ERP辅助报价是指通过企业资源计划系统提供的功能和工具&#xff0c;辅助企业进行报价流程的管理和执行。它涵盖了报价数据的收集、计算、分析和生成报价文件的全过程&#xff0c;以提高报价的准确性、效率和一致性。 二、ERP辅助报价的重要…

【2023年11月第四版教材】第12章《质量管理》(第二部分)

第12章《质量管理》&#xff08;第二部分&#xff09; 4 规划质量管理4.1 数据收集★★★4.2 数据分析★★★4.3 数据表现★★★4.4 质量管理计划★★★4.5 质量测量指标★★★ &#xff08;22下35&#xff09; 4 规划质量管理 组过程输入工具和技术输出计划1.规划质量管理1.项…

第一张 LVS负载均衡集群

一、LVS群集简介 1.群集的含义和应用场景 群集是为解决某个特定问题将多台计算机组合起来形成的单个系统&#xff0c;由多台主机构成&#xff0c;但对外只表现为一个整体&#xff0c;相当于一台大型计算机提供服务。 互联网应用中&#xff0c;随着站点对硬件性能、响应…

基于SSM的共享客栈管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

50etf期权的隐含波动率是什么意思?最通俗易懂的解释!

上证50ETF期权波动率是指衡量上证50ETF期权价格变动程度的指标&#xff0c;接触过期权的人应该都知道50etf期权的隐含波动率这个词。这是一个神秘的概念&#xff0c;初学者不容易理解&#xff0c;下文介绍50etf期权的隐含波动率是什么意思&#xff1f;隐波到底是什么&#xff1…

一分钟学会自制产品图册

​想自己制作精美的产品图册吗&#xff1f; 只需要一分钟&#xff01; 首先&#xff0c;你需要一款简单的制作工具&#xff0c;比如&#xff1a;FLBOOK在线制作电子杂志平台 1.点击开始创作选择套用模板制作 2.点击立即使用进入编辑页面 3.进入编辑页面后制作产品册时可以添加…

如何在 Vue.js 和 Nuxt.js 之间做出选择?

开篇 今天看了一位国外大佬的文章&#xff0c;主要是他对在项目中如何选择 Vue.js 或 Nuxt.js 的看法&#xff0c;欢迎大家在评论区发表看法&#xff0c;以下内容是他关于这个问题看法的整理&#xff0c;由于翻译水平有限&#xff0c;欢迎大家指正。 国外大佬的看法 Vue.js在开…

5.5 【MySQL】Page Header(页面头部)

在页中定义了一个叫Page Header的部分&#xff0c;它是页结构的第二部分&#xff0c;这个部分占用固定的56个字节&#xff0c;专门存储各种状态信息&#xff0c;具体如下&#xff1a; 名称 占用空间大小 描述 PAGE_N_DIR_SLOTS 2 字节 在页目录中的槽数量 PAGE_HEAP_TOP …

MySQL数据库——存储引擎(2)-存储引擎特点(InnoDB、MyISAM、Memory)、存储引擎选择

目录 存储引擎特点 InnoDB 介绍 特点 文件 逻辑存储结构 MyISAM 介绍 特点 文件 Memory 介绍 特点 文件 区别及特点 存储引擎选择 存储引擎特点 上面我们介绍了什么是存储引擎&#xff0c;以及如何在建表时如何指定存储引擎&#xff0c;接下来我们就来介绍比较…

【脑机接口】基于电子皮肤的先进可穿戴健康管理技术

第一作者&#xff1a;Vibhas Chugh 通讯单位&#xff1a;佛罗里达理工大学&#xff0c;印度摩哈利纳米科学与技术研究所. DOI: 10.1016/j.crbiot.2023.100129 背景介绍 人类的皮肤是与外界环境隔离的天然屏障&#xff0c;它具有感知各种感觉、温度变化和触摸压力的能力。皮…

python3在虚拟环境实用vscode调试错误输出ModuleNotFoundError: No module named ‘django‘解决方法

Exception has occurred: ImportError Couldnt import Django. Are you sure its installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?File "/data/mountain-backend/src/manage.py", line 8, i…

科普|含铊废水的来源及处理工艺介绍

铊(Tl)是一种银白色的金属&#xff0c;由于具有良好的延展性和导电性&#xff0c;被广泛用于电子、军工、航天、化工、冶金等众多领域。但在自然环境中含量很低&#xff0c;常在铅、铁、锌、铜等金属硫化矿中伴生&#xff0c;还以有机物结合形式存在于煤田和石油中。 铊的对于人…

数字化转型背景下企业知识管理能力提升路径

近年来&#xff0c;科技不断进步&#xff0c;颠覆性技术&#xff08;例如 5G、云计算、物联网、大数据分析和人工智能等&#xff09;正在重新定义企业如何管理项目和运营效率。知识管理体系亦需要随着科技的进步而改变&#xff0c;以适应新的数字时代环境&#xff0c;并且高效知…

【算法题】1462. 课程表 IV

题目&#xff1a; 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff0c;其中 prerequisites[i] [ai, bi] 表示如果你想选 bi 课程&#xff0c;你 必须 先选 ai 课程。 有的课会有直接的先修课程&#x…

Python从零到一构建项目

随着互联网的发展&#xff0c;网络上的信息量急剧增长&#xff0c;而获取、整理和分析这些信息对于很多人来说是一项艰巨的任务。而Python作为一种功能强大的编程语言&#xff0c;它的爬虫能力使得我们能够自动化地从网页中获取数据&#xff0c;大大提高了效率。本文将分享如何…

tkinter树形图组件

文章目录 初步回调函数绑定滚动条 初步 Treeview是ttk中的树形表组件&#xff0c;功能十分强大&#xff0c;非常适用于系统路径的表达。为了知道属性图到底是什么&#xff0c;下面先做个最简单的树形图 其代码如下 import tkinter as tk from tkinter import ttkdct {"…

datagridview设置随窗口改变大小

1&#xff0c;只需设置Anchor属性 2&#xff0c;捕捉Enter键 设置AcceptButton属性即可 这样的话&#xff0c;按下Enter键&#xff0c;直接到按钮btnApply