当前位置: 首页 > news >正文

C++高阶算法[汇总]

(一)高精度算法概述

高精度算法是指能够处理超出常规数据类型表示范围的数值的算法。在 C++ 中,标准数据类型通常有固定的位数和精度限制,而高精度算法可以解决大数运算、金融计算和科学计算等领域的问题。

(二)高精度算法的实现方法

  1. 使用第三方库,如 GMP、Boost.Multiprecision 等,提供扩展的数据类型和函数,能够处理任意大小的整数和高精度浮点数。
    • 这些第三方库为 C++ 程序员提供了强大的工具,使得处理大数运算变得更加容易。例如,在金融领域中,可能需要对非常大的数值进行精确计算,以确保交易的准确性和安全性。使用这些库,可以轻松地处理超出常规数据类型范围的数值,提高程序的可靠性和稳定性。
    • 同时,这些库通常具有良好的性能和优化,可以在处理大规模数据时保持高效的计算速度。程序员可以根据具体的需求选择合适的库,并利用其提供的功能来实现高精度算法。
  1. 自定义高精度数据结构,如链表表示的大整数,可以更深入地理解高精度算法的内部机制。
    • 自定义高精度数据结构是另一种实现高精度算法的方法。通过使用链表等数据结构,可以灵活地表示大整数,并实现各种数学运算。例如,可以使用链表的节点来存储大整数的每一位数字,通过对链表的操作来进行加法、减法、乘法和除法等运算。
    • 这种方法虽然实现复杂,但可以更深入地理解高精度算法的内部机制,对于学习和研究算法的原理非常有帮助。同时,自定义数据结构也可以根据具体的需求进行优化和调整,以提高算法的性能和效率。

(三)高精度算法的应用场景

  1. 加密货币:在比特币等加密货币的交易和挖矿过程中,高精度算法用于处理大数运算。
    • 加密货币的交易和挖矿涉及到大量的数值计算,其中很多数值超出了常规数据类型的表示范围。高精度算法可以准确地处理这些大数运算,确保交易的安全性和准确性。例如,在比特币的挖矿过程中,需要进行复杂的哈希计算,这些计算通常涉及到非常大的数值。高精度算法可以有效地处理这些计算,提高挖矿的效率和成功率。
  1. 科学模拟:在物理和化学模拟中,高精度算法可以提供更精确的计算结果。
    • 在科学模拟中,精度要求通常非常高,因为微小的误差可能会导致结果的巨大偏差。高精度算法可以提供更精确的计算结果,帮助科学家更好地理解和预测物理和化学现象。例如,在量子力学模拟中,需要对非常小的数值进行精确计算,高精度算法可以满足这种需求。
  1. 金融工程:在金融衍生品定价和风险管理中,高精度算法用于处理复杂的数学模型。
    • 金融工程领域涉及到复杂的数学模型和大量的数值计算,高精度算法在其中发挥着重要作用。例如,在金融衍生品定价中,需要对各种风险因素进行精确评估,这通常涉及到非常复杂的数学模型和大量的数值计算。高精度算法可以提供更准确的计算结果,帮助金融机构更好地管理风险和制定投资策略。

二、高效排序算法

(一)希尔排序

希尔排序通过将原数组分为几个子数组,先分别将这几个子数组排序,再把排序好的子数组进行排序,可以大大提高效率,排序方法可使用任意简单排序,这里使用插入排序。

希尔排序,也称为 Shell 排序,是一种就地比较排序算法。它通过比较和交换相距较远的元素来对数组进行排序,从而推广了插入排序或冒泡排序等交换排序。此排序算法以其发明者 Donald Shell 命名,他在 1959 年首次发表了该算法。

希尔排序通过比较和交换相距较远的元素来减少无序度。最初,比较和交换距离较远的元素,然后逐渐减少比较和交换的间距,直到间距为 1,此时算法变为简单的插入排序。间距序列的选择对算法的性能有显著影响。

希尔排序算法可以分为以下几个步骤:

  1. 选择一个间距序列。
  1. 对每个间距进行间隔插入排序。
  1. 减少间距,重复步骤 2,直到间距为 1。

间距序列的选择是算法性能的关键。常用的间距序列包括:

  • Shell 的原始序列:n/2, n/4, …, 1
  • Hibbard 序列:1, 3, 7, 15, …, 2^k - 1
  • Sedgewick 序列:1, 5, 19, 41, 109, …

下面是希尔排序在 C++ 中的两个实现。第一个实现使用固定的间距序列,第二个实现使用动态计算的间距。

实现方式一:固定间距序列

 

#include<iostream>

void print(int a[],int n){

for(int i =0; i < n; i++){

std::cout << a[i]<<" ";

}

std::cout << std::endl;

}

void shellSort(int a[],int n){

int gap =3;

int i, j;

while(gap--){

for(i = gap; i < n; i++){

int key = a[i];

for(j = i - gap; j >=0&& a[j]> key; j -= gap){

a[j + gap]= a[j];

}

a[j + gap]= key;

}

}

}

int main(){

int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};

int n = sizeof(a)/sizeof(a[0]);

print(a,n);

shellSort(a,n);

print(a,n);

return 0;

}

实现方式二:动态间距序列

 

#include<iostream>

#include<vector>

using namespace std;

// 希尔排序函数

void shellSort(vector<int> &v) {

int n = v.size();

int h = 1;

while (h < n / 3) {

h = 3 * h + 1;

}

while (h >= 1) {

for (int i = h; i < n; i++) {

for (int j = i; j >= h && v[j] < v[j - h]; j -= h) {

swap(v[j], v[j - h]);

}

}

h = h / 3;

}

}

int main() {

vector<int> arr = {9, 4, 2, 8, 5, 1, 7, 3, 6};

cout << "希尔排序前:";

for (int i = 0; i < arr.size(); i++) {

cout << arr[i] << " ";

}

cout << endl;

shellSort(arr);

cout << "希尔排序后:";

for (int i = 0; i < arr.size(); i++) {

cout << arr[i] << " ";

}

cout << endl;

return 0;

}

(二)堆排序

堆排序从堆开始,将最大的元素放在数组末尾,然后重建少了一个元素的堆。在新堆中,将最大的元素移到正确的位置上,然后为其他元素恢复堆属性。

堆排序是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

  1. 第一步,升序建大堆
  1. 第二步,将根结点与最后的叶子结点交换,然后再次建大堆 (每次最后确定的最大数不参与建大堆)

实现代码(升序建大堆):

 

#include<iostream>

#include<vector>

void AdjustDown(vector<int>& a,int n,int root){

int parent=root;

int child=parent*2+1;

while(child<n){

if(child+1<n&&a[child+1]>a[child]){

++child;

}

if(a[child]>a[parent]){

swap(a[child],a[parent]);

parent=child;

child=parent*2+1;

}else{

break;

}

}

}

void HeapSort(vector<int>& a,int n){

//排升序,建大堆

for(int i=(n-1-1)/2;i>=0;i--){

AdjustDown(a,n,i);

}

int end=n-1;

while(end>0){

swap(a[0],a[end]);

AdjustDown(a,end,0);

end--;

}

}

int main(){

int n;

cin >> n;

vector<int> a;

while(n--){

int k;

cin >> k;

a.push_back(k);

}

HeapSort(a, a.size());

for(auto e : a){

cout << e << " ";

}

return 0;

}

堆排序使用堆来选数,效率就高了很多。时间复杂度:O (N*logN),空间复杂度:O (1),稳定性:不稳定。

(三)快速排序

快速排序以一个边界值为基准划分为两个数组,第一个数字中所有的元素都小于边界值,第二个则都大于边界值。然后不断的迭代下去,直到划分为只包含一个元素的数组。

快速排序(Quick Sort)是一种高效的排序算法,由英国计算机科学家东尼・霍尔(Tony Hoare)于 1960 年发明。

快速排序算法的基本思想是分治法(Divide and Conquer),其核心步骤如下:

  1. 选择一个基准元素(pivot),通常选择序列中的第一个或最后一个元素。
  1. 将序列分为两部分,一部分是小于等于基准元素的元素,另一部分是大于基准元素的元素。
  1. 递归地对这两部分序列进行快速排序。

详细描述一下给任意 n 个数排序的快速排序算法:

  1. 假设我们要对数组 a [1..n] 排序。初始化区间 [1..n] 。
  1. 令 l 和 r 分别为当前区间的左右端点。下面假设我们对 l 到 r 子段内的数字进行划分。取 pivot = a [l] 为分界线,将 < pivot 的数字移到左边,>pivot 的数字移到右边,然后将 pivot 放在中间。假设 pivot 的位置是 k。
  1. 如果左边区间 [l..k - 1] 长度大于 1,则对于新的区间 [l..k - 1],重复调用上面的过程。
  1. 如果右边区间 [k + 1..r] 长度大于 1,则设置新的区间 [k + 1, r],重复调用上面的过程。当整个过程结束以后,整个序列排序完毕。

代码实现:

 

// 该代码参考 https://www.geeksforgeeks.org/quick-sort/

#include<bits/stdc++.h>

#define N 100010

using namespace std;

int n;

int a[N];

void quick_sort(int l,int r){

// 设置最右边的数为分界线

int pivot = a[r];

// 元素移动

int k = l -1;

for(int j = l; j < r;++j)

if(a[j]< pivot)

swap(a[j], a[++k]);

swap(a[r], a[++k]);

if(l < k -1)quick_sort(l, k -1);

// 如果序列的分界线左边的子段长度>1,排序

if(k +1< r)quick_sort(k +1, r);

// 如果序列的分界线右边的子段长度>1,排序

// 上面的过程结束后,到这里左子段和右子段已经分别排好序。又因为确定分界线以后的移动操作

// 保证了左子段中的元素都小于等于分界线,右子段中的元素都大于分界线。所以整个序列也是有序的。

}

int main(){

// 输入

scanf("%d",&n);

for(int i =1; i <= n;++i)

scanf("%d",&a[i]);

// 快速排序

quick_sort(1, n);

// 输出

for(int i =1; i <= n;++i)

printf("%d ", a[i]);

return 0;

}

快速排序的空间复杂度是 O (n),具体来说,在整个排序过程中,元素的移动都在原始数组中进行。所以快速排序是一种原地排序算法。时间复杂度分析:在「详细算法描述」中,我们的算法分为若干层。每一层中都是分治法的三个步骤:我们首先进行问题拆分,然后进入下一层,下一层的问题解决后,我们返回这一层进行子问题解的合并。

对于子段解的合并,其复杂度是 O (1),因为有分界线的存在,当我们把左边和右边都排好序后,它们和分界线元素一起天然形成了原序列的完整排序。而问题拆分的复杂度是 O (n),因为我们移动数组元素的时候,需要将每个子段扫一遍。那么把所有层的子段一起看,就相当于在每一层都把整个序列完整扫了一遍。

一共有多少层呢?因为每次我们都知道当前子段的中位数,所以可以保证每次划分,两个字段长度比较平衡,所以下一层子段的长度都比上一层减少了一半,直到长度为 1 算法停止。

三、复杂排序算法

(一)鸽巢排序

鸽巢排序是一种基于计数的排序算法,它利用了鸽巢原理的概念。具体步骤如下:

首先确定待排序序列中的最小值和最大值,以便确定需要准备多少个鸽巢,即桶或容器。例如,对于一个待排序的数组,先找到其中的最小元素和最大元素。

然后创建一个与鸽巢数量相同的鸽巢数组,并初始化为 0。这个鸽巢数组的大小为(最大值 - 最小值 + 1)。

接着遍历待排序数组的所有元素,将元素的值减去最小值得到鸽巢数组的下标,然后将鸽巢数组的对应位置加 1。比如,如果一个元素的值为 10,最小值为 5,那么它对应的鸽巢数组下标为 5,将鸽巢数组中下标为 5 的位置的值加 1。

最后遍历鸽巢数组,将非 0 的值依次放回原数组。按照鸽巢数组的顺序,将对应位置的值不为 0 的元素依次放回原数组,即可得到有序序列。

以下是使用 C++ 实现鸽巢排序算法的代码:

 

#include<iostream>

#include<vector>

void pigeonholeSort(std::vector<int>& arr){

int minVal = arr[0];

int maxVal = arr[0];

for (int i = 1; i < arr.size(); ++i) {

if (arr[i] < minVal) {

minVal = arr[i];

}

if (arr[i] > maxVal) {

maxVal = arr[i];

}

}

int range = maxVal - minVal + 1;

std::vector<int> holes(range,0);

for (int i = 0; i < arr.size(); ++i) {

holes[arr[i] - minVal]++;

}

int index = 0;

for (int i = 0; i < range; ++i) {

while (holes[i] > 0) {

arr[index++] = i + minVal;

holes[i]--;

}

}

}

鸽巢排序算法的优点是简单易懂,且对于某个范围内的整数排序效果较好。然而,该算法的缺点是需要额外的空间存储鸽巢数组,且无法处理非整数数据类型。对于较大的数据范围,鸽巢数组的大小也会变得很大,使得算法的空间复杂度增加。

(二)圈排序

圈排序是一种基于交换的不稳定排序算法。该算法通过将每个元素移动到它应该在的位置来完成排序。

具体过程是,对于待排序序列中的每个元素,我们将其放回正确的位置,并将原来位置上的元素继续移动,直到回到起始位置。

例如,对于一个待排序的数组,从第一个元素开始,将其与其他元素进行比较,找到它在排序后应该处于的位置。如果第一个元素不在正确的位置上,将其与当前位置上的元素交换,直到它处于正确的位置上。然后,对下一个元素进行同样的操作,直到所有元素都在正确的位置上。

以下是使用 C++ 实现圈排序算法的代码:

 

#include<iostream>

#include<vector>

void cycleSort(std::vector<int>& arr){

int n = arr.size();

for (int cycleStart = 0; cycleStart < n - 1; ++cycleStart) {

int item = arr[cycleStart];

int pos = cycleStart;

for (int i = cycleStart + 1; i < n; ++i) {

if (arr[i] < item) {

pos++;

}

}

if (pos == cycleStart) continue;

while (item == arr[pos]) pos++;

if (pos!= cycleStart) {

std::swap(item, arr[pos]);

}

while (pos!= cycleStart) {

pos = cycleStart;

for (int i = cycleStart + 1; i < n; ++i) {

if (arr[i] < item) {

pos++;

}

}

while (item == arr[pos]) pos++;

if (item!= arr[pos]) std::swap(item, arr[pos]);

}

}

}

圈排序算法具有以下优点:圈排序是一种原地排序算法,不需要额外的空间;圈排序是一种稳定的排序算法,相等元素的相对顺序不会被改变;圈排序对于包含大量重复元素的数组具有较好的性能,因为它只进行必要的交换操作。

(三)反序列排序

反序列排序算法是一种随机打乱待排序序列,然后检查是否已经有序,如果没有则重复这个过程的算法。

例如,对于一个待排序的数组,首先随机打乱数组的顺序。然后检查数组是否已经有序,如果不是,则再次随机打乱数组,直到数组有序为止。

以下是使用 C++ 实现反序列排序算法的代码:

 

#include<iostream>

#include<vector>

#include<algorithm>

bool isSorted(std::vector<int>& arr){

for (int i = 0; i < arr.size() - 1; ++i) {

if (arr[i] > arr[i + 1]) {

return false;

}

}

return true;

}

void bogoSort(std::vector<int>& arr){

while (!isSorted(arr)) {

std::random_shuffle(arr.begin(), arr.end());

}

}

尽管反序列排序算法结构简单,但它的平均时间复杂度为 O ((n+1)!),因此在实际应用中几乎不会使用。

(四)慢速排序

慢速排序是一种递归的排序算法,它使用了冒泡排序的变体。将待排序序列划分为两部分,然后递归地对这两部分进行排序,最后再通过交换相邻元素来确保序列有序。

具体来说,对于一个待排序的数组,首先将数组划分为两部分。然后递归地对这两部分进行排序。接着,如果数组中间位置的元素大于右边位置的元素,则交换这两个元素。最后,递归地对左边部分和右边部分分别进行排序,直到整个数组有序。

以下是使用 C++ 实现慢速排序算法的代码:

 

#include<iostream>

#include<vector>

void slowSort(std::vector<int>& arr, int left, int right){

if (left >= right) {

return;

}

int mid = (left + right) / 2;

slowSort(arr, left, mid);

slowSort(arr, mid + 1, right);

if (arr[mid] > arr[right]) {

std::swap(arr[mid], arr[right]);

}

slowSort(arr, left, right - 1);

}

四、高级算法应用场景

(一)堆排序、归并排序、二分查找在面试中的应用

在面试中,堆排序、归并排序、二分查找等高级算法常常是考察的重点内容。不仅要求能够准确地写出这些算法的代码,还需要深入理解其工作原理和性能特点,甚至能够对其进行变种的讨论或在特定场景下进行优化。

对于堆排序,面试官可能会要求解释其建堆和调整堆的过程,以及如何利用堆来实现排序。例如,可以通过分析堆的性质,即大根堆中每个节点的值都大于等于其子节点的值,小根堆中每个节点的值都小于等于其子节点的值,来阐述堆排序的原理。在性能方面,堆排序的时间复杂度为 ,空间复杂度为 ,稳定性为不稳定。面试官可能会进一步询问如何在实际应用中优化堆排序,或者在特定场景下如何选择使用堆排序还是其他排序算法。

归并排序也是面试中常见的算法之一。面试官可能会要求解释归并排序的分治思想,即先将数组分成两个子数组,分别进行排序,然后再将两个有序的子数组合并成一个有序的数组。在实现归并排序时,需要注意空间复杂度的问题,因为归并排序需要额外的空间来存储临时数组。此外,面试官可能会询问归并排序的稳定性,以及如何在实际编程中应用归并排序来处理大规模数据。

二分查找是一种高效的查找算法,前提是数据结构必须先排好序。面试官可能会要求解释二分查找的原理,即通过不断缩小查找范围,每次将查找区间分为两部分,根据中间元素与目标元素的大小关系来确定下一步的查找方向。在面试中,还可能会出现二分查找的变种问题,如查找第一个出现的等于给定目标值的元素、查找最后一次出现的等于给定目标值的元素、查找第一个大于等于给定值的元素、查找最后一个小于等于给定值的元素等。这些变种问题需要对二分查找的原理有深入的理解,并能够灵活地运用。

对于更高级的面试,可能会要求讨论这些算法的变种,或者在特定情景下如何优化它们。例如,在堆排序中,可以考虑使用不同的堆结构,如大根堆和小根堆的混合使用,或者在归并排序中,可以采用并行归并的方式来提高效率。在二分查找中,可以根据数据的分布特点来选择不同的查找策略,或者在特定的数据结构上进行二分查找的优化。

总之,在面试中,对堆排序、归并排序、二分查找等高级算法的掌握程度是考察应聘者编程能力和算法思维的重要指标之一。通过深入理解这些算法的原理和性能特点,并能够在实际问题中灵活运用和优化,能够提高在面试中的竞争力。

(二)高级排序算法在实际编程中的应用

高级排序算法在数据处理、游戏开发、系统编程等多种场景下都有广泛的应用。这些算法可以帮助快速排序、搜索和过滤数据,在 AI 决策、路径查找等方面发挥重要作用,同时还能优化性能和资源管理。

在数据处理领域,高级排序算法可以对大规模数据进行高效的排序和搜索。例如,归并排序可以将多个有序的子数组合并成一个有序的数组,适用于处理大规模数据的排序问题。堆排序可以快速地找到数据中的最大值或最小值,适用于优先队列等数据结构。二分查找可以在有序数据中快速地查找特定元素,提高数据检索的效率。

在游戏开发中,高级排序算法也有着重要的应用。例如,在游戏中的排行榜功能中,可以使用快速排序或归并排序对玩家的得分进行排序,以便展示给玩家。在游戏中的路径查找算法中,如 A * 算法,需要对开放列表和关闭列表进行排序,以提高算法的效率。此外,在游戏中的资源管理中,也可以使用排序算法对资源进行分类和排序,以便更好地管理和利用资源。

在系统编程中,高级排序算法可以优化性能和资源管理。例如,在操作系统的内存管理中,可以使用堆排序或快速排序对内存块进行排序,以便更好地分配和回收内存。在数据库管理系统中,排序算法可以用于对数据进行索引和查询优化。在网络编程中,排序算法可以用于对数据包进行排序和处理,以提高网络通信的效率。

总之,高级排序算法在实际编程中有着广泛的应用,可以帮助提高程序的性能和效率,优化资源管理,解决各种实际问题。在选择使用高级排序算法时,需要根据具体的应用场景和需求,综合考虑算法的时间复杂度、空间复杂度、稳定性等因素,选择最合适的算法。

相关文章:

C++高阶算法[汇总]

&#xff08;一&#xff09;高精度算法概述 高精度算法是指能够处理超出常规数据类型表示范围的数值的算法。在 C 中&#xff0c;标准数据类型通常有固定的位数和精度限制&#xff0c;而高精度算法可以解决大数运算、金融计算和科学计算等领域的问题。 &#xff08;二&#x…...

机器学习之DeepMind推出的DreamerV3

开放域任务强化学习(Open-Ended Task Reinforcement Learning)的目标是使智能体能够在多样化且未见过的任务中表现出色,同时能够实现任务间的迁移学习。这类研究的重点在于开发通用的学习算法,能够在没有明确任务定义的情况下,从环境中学习并推广到新任务。DeepMind的Drea…...

【Zookeeper】四,Zookeeper节点类型、通知、仲裁、会话

文章目录 Zookeeper的架构znode的版本Zookeeper的节点类型层级树状结构znode的不同类型 Zookeeper监视与通知通知的类型 Zookeeper的仲裁Zk的会话会话的生命周期 Zookeeper的架构 Zookeeper的服务器端运行两种模式&#xff1a;独立模式&#xff08;standalone&#xff09;和仲…...

Vue 集成和使用 SQLite 的完整指东

1. 引言 SQLite 是一种轻量级的关系型数据库管理系统&#xff0c;以其简单易用、无需服务器等特点广泛应用于嵌入式系统、移动应用和小型应用程序中。在 Web 开发中&#xff0c;尤其是前端应用开发中&#xff0c;SQLite 可以作为客户端本地存储的一种选择&#xff0c;为用户提…...

CMAKE常用命令详解

NDK List基本用法 Get–获取列表中指定索引的元素 list(Get list_name index output_var)解释 list_name: 要操作集合的名称index: 要取得的元素下标output_var: 保存从集合中取得元素的结果 栗子 list(GET mylist 0 first_element) # 获取第一个元素APPEND–在列表末尾…...

【嵌入式——QT】QT制作安装包

第一步 QT程序写好之后&#xff0c;编译release版本 第二步 拿到release生成的.exe文件 第三步 新建文件夹deploy 第四步 将.exe文件复制到deploy目录下 第五步 在该目录下输入cmd指令&#xff0c;回车 第六步 在打开的命令窗口下输入 windeployqt TegNetCom_1.0.…...

JavaScript 前端开发:从入门到精通的奇幻之旅

目录 一、引言 二、JavaScript 基础 &#xff08;一&#xff09;变量与数据类型 &#xff08;二&#xff09;运算符 &#xff08;三&#xff09;控制结构 三、函数 &#xff08;一&#xff09;函数定义与调用 &#xff08;二&#xff09;函数作用域 &#xff08;三&am…...

shell编程基础笔记

目录 echo改字体颜色和字体背景颜色 bash基本功能&#xff1a; 运行方式&#xff1a;推荐使用第二种方法 变量类型 字符串处理&#xff1a; 条件判断&#xff1a;&#xff08;使用echo $?来判断条件结果&#xff0c;0为true&#xff0c;1为false&#xff09; 条件语句&a…...

FPGA实现GTP光口视频转USB3.0传输,基于FT601+Aurora 8b/10b编解码架构,提供3套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案本博已有的FPGA驱动USB通信方案 3、工程详细设计方案工程设计原理框图输入Sensor之-->OV5640摄像头输入Sensor之-->芯片解码的…...

使用 PDF API 合并 PDF 文件

内容来源&#xff1a; 如何在 Mac 上合并 PDF 文件 1. 注册与认证 您可以注册一个免费的 ComPDFKit API 帐户&#xff0c;该帐户允许您在 30 天内免费无限制地处理 1,000 多个文档。 ComPDFKit API 使用 JSON Web Tokens 方法进行安全身份验证。从控制面板获取您的公钥和密钥&…...

Jenkins Nginx Vue项目自动化部署

目录 一、环境准备 1.1 Jenkins搭建 1.2 NVM和Nodejs安装 1.3 Nginx安装 二、Jenkins配置 2.1 相关插件安装 2.2 全局工具安装 2.3 环境变量配置 2.4 邮箱配置&#xff08;构建后发送邮件&#xff09; 2.5 任务配置 三、Nginx配置 3.1 配置路由转发 四、部署项目 …...

python代码实现问卷星问卷内容获取并写入word文档保存

以下附完整代码。 import os from tkinter import Tk, simpledialog, messagebox from docx import Document import time import requests import re from tkinter import ttk# 使用 tkinter 创建一个简单的输入框来获取用户输入的问卷链接 root Tk() root.title("问卷…...

C# 2024年Visual Studio实用插件集合

在2024年&#xff0c;Visual Studio作为.NET开发者的首选IDE&#xff0c;其插件生态不断壮大&#xff0c;为开发者提供了更高效、便捷的开发体验。本文将介绍一些实用的Visual Studio插件&#xff0c;特别是针对C#开发者&#xff0c;帮助提升开发效率和代码质量。 1. GitHub C…...

基于PHP的香水销售系统的设计与实现

摘 要 时代科技高速发展的背后&#xff0c;也带动了经济的增加&#xff0c;人们对生活质量的要求也不断提高。香水作为一款在人际交往过程中&#xff0c;给对方留下良好地第一印象的产品&#xff0c;在生活中也可以独自享受其为生活带来的点缀。目前香水市场体量庞大&#xff…...

QT去除窗口边框(无边框)

ch21_TencentMeetingLogin::ch21_TencentMeetingLogin(QWidget *parent): QDialog(parent) {ui.setupUi(this);this->setWindowFlags(Qt::FramelessWindowHint);//去除窗口边框 } 但此时窗口不能拖动且点击任务栏程序图标不能最小化&#xff01; this->setWindowFlags(Q…...

【k8s】监控metrics-server

metrics-server介绍 Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中。Metric server从每个节点上KubeletAPI收集指标&#xff0c;通过Kubernetes聚合器注册在Master APIServer中。为集群提供Node、Pods资源利用率指标。 就像Linux 系统一样…...

「Qt Widget中文示例指南」如何为窗口实现流程布局?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文将展示如何为不…...

EditInPlace就地编辑:Dom vs Form

利用Dom和Form实现就地编辑&#xff08;EditInPlace&#xff09;功能&#xff0c;两者在实现方式、用户体验和适用场景上有一些区别。下面我将详细解释这些区别&#xff1a; 1. EditInPlace 就地编辑&#xff08;EditInPlace&#xff09;是一种用户界面设计模式&#xff0c;允…...

【SCT63142FIB】15W高集成、高效率的无线功率发射PMIC

SCT63142FIB 15W高集成、高效率的无线功率发射PMIC 描述 SCT63142是一款高度集成的电源管理IC&#xff0c;可实现符合WPC规范的高性能&#xff0c;高效率和成本效益的无线电源发送系统&#xff0c;支持高达15W的功率传输&#xff0c;可与无线应用特定控制器或基于通用MCU的发送…...

STM32F4系列单片机新玩法---Micropython--pyBoard

只需要更改main.py文件的内容即可&#xff0c;例程CRTLV 1、流水灯&#xff1a; # main.py -- put your code here! import pyb while(1): for n in range(1,5) ledpyb.LED(n) led.on() pyb.delay(1000) led.off() 2、灯条,可以改变delay值来凸显效果…...

MFC中如何在工具条动态增加菜单

在C:\temp\VCSamples-master\VC2010Samples\MFC\Visual C 2008 Feature Pack\WordPad 这个例子中倒是有在工具条上动态增加菜单的方法&#xff0c;但有个缺陷&#xff0c;必须预先将需要的按钮定死。现将方法总结如下&#xff1a; 效果如下&#xff1a;点击前&#xff1a; 点击…...

行为型模式-迭代器模式

迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;主要用于提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而不需要暴露其内部表示。这个模式常被用于集合类对象&#xff08;如列表、数组、图等&#xff09;的实现中。 模式结构…...

SAP SD学习笔记17 - 投诉处理3 - Credit/Debit Memo依赖,Credit/Debit Memo

上一章讲了 请求书&#xff08;发票&#xff09;的取消。 SAP SD学习笔记16 - 请求书的取消 - VF11-CSDN博客 再往上几章&#xff0c;讲了下图里面的返品传票&#xff1a; SAP SD学习笔记14 - 投诉处理1 - 返品处理&#xff08;退货处理&#xff09;的流程以及系统实操&#…...

digit_eye开发记录(3): C语言读取MNIST数据集

在前两篇&#xff0c;我们解读了 MNIST 数据集的 IDX 文件格式&#xff0c;并分别用 C 和 Python 做了 读取 MNIST 数据集的实现。 基于 C 的代码稍长&#xff0c;基于 Python 的代码则明显更短&#xff0c;然而它们的共同特点是&#xff1a;依赖了外部库&#xff1a; 基于 C …...

快速学习GO语言总结

干货分享&#xff0c;感谢您的阅读&#xff01;备注&#xff1a;本博客将自己初步学习GO的总结进行分享&#xff0c;希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力&#xff0c;如有错误请留言指正&#xff0c;谢谢&#xff01; 一、初步了解Go语言 &#xf…...

开源多媒体处理工具ffmpeg是什么?如何安装?使用ffmpeg将M3U8格式转换为MP4

目录 一、FFmpeg是什么二、安装FFmpeg&#xff08;windows&#xff09;三、将M3U8格式转换为MP4格式 一、FFmpeg是什么 FFmpeg是一款非常强大的开源多媒体处理工具&#xff0c;它几乎可以处理所有类型的视频、音频、字幕以及相关的元数据。 FFmpeg的主要用途包括但不限于&…...

Python面试实战:高效处理海量日志,找出高频IP

Python面试实战:高效处理海量日志,找出高频IP 问题描述 在处理海量服务器日志时,一个常见的需求是统计出现次数最多的IP地址。这不仅有助于分析网站访问流量,还能为安全监控提供有价值的信息。然而,当日志文件过大,无法一次性加载到内存时,如何高效地解决这个问题就成…...

基于Java Springboot蛋糕订购小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…...

Java进程为什么会消失

深夜&#xff0c;办公室里只剩下电脑屏幕的微光。小王正在紧张地盯着生产环境的监控面板&#xff0c;突然发现一个重要的Java应用进程不见了&#xff0c;就像人间蒸发一般。这种情况在Java开发中并不罕见&#xff0c;让我们一起走进这个技术探案&#xff0c;揭开Java进程神秘消…...

继上一篇,设置弹框次数以及自适应图片弹框,部分机型(vivo)老手机不显示的问题

上一篇写的本来测试好多型号都无事, 今天下午公司的战斗机vivo横空冒出… 晕 弹框直接显示都出不来了,现在还有用这种老的机型的,但是没办法咯~ 前端遇到这种兼容性的问题就要勇于解决 主要解决了这几点: // 添加图片加载事件 <imgv-if"imageUrl":src"image…...

【docker】容器卷综合讲解,以及go实现的企业案例

容器卷&#xff08;Volumes&#xff09;基础讲解&#xff1a; 容器概念 容器卷&#xff08;Volumes&#xff09;是 Docker 提供的一种持久化存储机制&#xff0c;允许容器持久化数据&#xff0c;即使容器被删除或重新创建&#xff0c;数据仍然可以保留。 卷是独立于容器的&…...

八、利用CSS制作导航栏菜单

8.1 水平顶部导航栏 水平菜单导航栏是网站设计中应用范围最广的导航设计&#xff0c;一般放置在页面的顶部。水平导航适用性强&#xff0c;几乎所有类型的网站都可以使用。 如果导航过于普通&#xff0c;无法容纳复杂的信息结构&#xff0c;就需要在内容模块较多的情况…...

windows下安装node.js和pnpm

首先&#xff0c;一定要powershell右键选择管理员身份运行&#xff0c;否则第三个命令报错。 # 安装 fnm (快速 Node 管理器) winget install Schniz.fnm# 配置 fnm 环境 fnm env --use-on-cd | Out-String | Invoke-Expression# 下载并安装 Node.js fnm use --install-if-mis…...

MyBlog(五) -- 用户注册页面完善

文章目录 前言一、用户数据提交1. 表单2. 校验数据3. 模版文件1. wait_start2. user_register 二、验证1. 发送邮件1. 注册163邮箱后登录并设置2. 开启IMAP/SMTP服务, IMAP/SMTP服务3. 新增授权密码 2.邮箱内容3.点击注册4.发送邮件5. 激活账号1. 完善激活功能 -- user_active2…...

NLP任务四大范式的进阶历程:从传统TF-IDF到Prompt-Tuning(提示词微调)

引言&#xff1a;从TF-IDF到Prompt-Tuning&#xff08;提示词微调&#xff09;&#xff0c;NLP的四次变革 自然语言处理&#xff08;NLP&#xff09;技术从最早的手工特征设计到如今的Prompt-Tuning&#xff0c;经历了四个重要阶段。随着技术的不断发展&#xff0c;我们的目标…...

量化交易系统开发-实时行情自动化交易-8.3.开拓者TBQuant平台

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来会对于开拓者TBQuant平台介绍。 …...

第八课 Unity编辑器创建的资源优化_特效篇(Particle System)详解

无论是CPU还是GPU&#xff0c;粒子系统对其的影响面都是不容小觑的。随着项目的重度化和3A化&#xff0c;玩家的口味变挑剔了、游戏玩法复杂度变高了、画面的特效表现变复杂了......所以我们还是更加谨慎地对待粒子系统。 特效&#xff08;Particle System&#xff09; 游戏效…...

redis常见数据类型

Redis是一个开源的、内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息代理&#xff0c;支持多种数据类型。 一、数据类型介绍 String&#xff08;字符串&#xff09; Redis中最基本的数据类型。可以存储任何类型的数据&#xff0c;包括字符串、数字和二进制…...

【解决安全扫描漏洞】---- 检测到目标站点存在 JavaScript 框架库漏洞

1. 漏洞结果 JavaScript 框架或库是一组能轻松生成跨浏览器兼容的 JavaScript 代码的工具和函数。如果网站使用了存在漏洞的 JavaScript 框架或库&#xff0c;攻击者就可以利用此漏洞来劫持用户浏览器&#xff0c;进行挂马、XSS、Cookie劫持等攻击。 1.1 漏洞扫描截图 1.2 具体…...

深入解析 Kubernetes 节点操作:Cordon、Uncordon 和 Drain 的使用与最佳实践

摘要 Kubernetes 是一个用于自动化容器部署、扩展和管理的开源系统&#xff0c;而节点管理是其核心功能之一。cordon、uncordon 和 drain 是 Kubernetes 提供的与节点操作相关的三个重要命令&#xff0c;用于节点的调度控制和维护管理。本文将从概念、命令解析、内部机制和最佳…...

python array矩阵相关操作

目录&#xff1a; 一、判断某个值是否在array二维数组的某列中 二、根据某列中的特定值筛选array数组 三、查找一个元素在二维 array 矩阵中的位置 四、判断array数组中的每个元素是否包含特定的子字符串 一、判断某个值是否在array二维数组的某列中 在 Python 中&#xf…...

网络安全——浅谈HTTP协议

HTTP请求 HTTP请求是客户端往服务端发送请求动作&#xff0c;告知服务器自己的要求。 HTTP请求由状态行、请求头、请求正文三部分组成&#xff1a; 状态行&#xff1a;包括请求方式Method、资源路径URL、协议版本Version&#xff1b;请求头&#xff1a;包括一些访问的域名、…...

BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比

BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计…...

55 基于单片机的方波频率可调

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 采用STC89C52单片机最小系统&#xff0c;设计DAC0832、放大器、与示波器显示方波&#xff0c;四位数码管显示频率&#xff0c;两个按键可调。 二、硬件资源 基于KEIL5编写C代码&#xff0c;PROT…...

SAP SD学习笔记15 - 投诉处理2 - 返品处理流程之 参照请求传票(发票)来生成返品传票

上一章讲了返品处理&#xff08;退货处理&#xff09;的流程。 SAP SD学习笔记14 - 投诉处理1 - 返品处理&#xff08;退货处理&#xff09;的流程以及系统实操&#xff0c;比如 返品传票&#xff1b;请求Block标记&#xff1b;收到退货之后的处理&#xff0c;请求传票的登录_…...

LWIP和FATFS 实现 FTP 服务端

目录 一、前言 二、LWIP 和 FTP 简介 1.LWIP 2.FTP 三、实现 FTP 服务端的主要步骤 1.初始化 LWIP 2.创建 FTP 服务器任务 3.处理客户端连接 4.实现 FTP 命令处理 5.文件系统操作 6.错误处理和日志记录 四、示例代码 1.创建FTP任务 2. FTP任务代码 3.处理交互数据…...

缓冲区的奥秘:解析数据交错的魔法

目录 一、理解缓存区的好处 &#xff08;一&#xff09;直观性的理解 &#xff08;二&#xff09;缓存区的好处 二、经典案例分析体会 &#xff08;一&#xff09;文件读写流&#xff08;File I/O Buffering&#xff09; BufferedOutputStream 和 BufferedWriter 可以加快…...

【MySQL — 数据库基础】MySQL的安装与配置 & 数据库简单介绍

数据库基础 本节目标 掌握关系型数据库&#xff0c;数据库的作用掌握在Windows和Linux系统下安装MySQL数据库了解客户端工具的基本使用和SQL分类了解MySQL架构和存储引擎 1. 数据库的安装与配置 1.1 确认MYSQL版本 处理无法在 cmd 中使用 mysql 命令的情况&a…...

如何使用Python解析从淘宝API接口获取到的JSON数据?

基本的 JSON 解析 当从淘宝 API 接口获取到数据后&#xff08;假设数据存储在变量response_data中&#xff09;&#xff0c;首先要判断数据类型是否为 JSON。如果是&#xff0c;就可以使用 Python 内置的json模块进行解析。示例代码如下&#xff1a; import json # 假设respon…...

Day1 生信新手笔记

生信新手笔记 生信学习第一天笔记打卡。 转录组学中&#xff1a; 上游分析-基于linux&#xff0c;包括质控、过滤、比对、定量&#xff1b; 下游分析-基于R语言&#xff0c;包括差异分析、富集分析、可视化。 1. 级别标题 一个井号加空格 就是一级标题&#xff0c;两个井号加…...