0627,0628,0629,排序,文件

01:请实现选择排序,并分析它的时间复杂度,空间复杂度和稳定性

void selection_sort(int arr[], int n);

解答:

稳定性:稳定,   不稳定的,会发生长距离的交换  4         9 9 4 1    ,把第一个4换掉了

时间复杂度:比较(n-1)+(n-1)+(n-3)+……+1=n*(n/2)=O(n^2)

交换:最好情况,不交换,最坏情况O(n^2)==比较

一般情况:O(n^2)

空间复杂度:O(1)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE(a) (sizeof(a)/sizeof(a[0]))void selection_sort(int arr[], int n) {int max;for (int i = 0; i < n-1; i++) {//和后面的LEN-1个比较max = i;for (int j = i + 1; j < n; j++) {//max=arr[j]   arr[i]<arr[j]  swapif (arr[max] < arr[j]) {     //相等的元素不发生交换,稳定max = j;}}//swap(arr[i], arr[max]);int temp = arr[i];arr[i] = arr[max];arr[max] = temp;}
}
void print_arr(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d  ", arr[i]);}printf("\n");
}int main(void) {int arr[] = { 2,34,12,12,34,56,78,90,899,100 };print_arr(arr, SIZE(arr));selection_sort(arr, SIZE(arr));print_arr(arr, SIZE(arr));return 0;
}

答案:

#define SWAP(arr, i, j) {	\int tmp = arr[i];		\arr[i] = arr[j];		\arr[j] = tmp;			\
}void selection_sort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {int minIdx = i;// 找到最小元素的索引for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIdx]) {minIdx = j;}}// 交换arr[i]和arr[j]SWAP(arr, i, minIdx);// print_array(arr, n);}
}分析:
1. 时间复杂度:O(n^2)比较次数: (n-1) + (n-2) + ... + 1 = n(n-1)/2交换次数:n-1
2. 空间复杂度:O(1)不需要申请而外的数组
3. 稳定性: 不稳定会发生长距离的交换

02:请实现冒泡排序,并分析它的时间复杂度,空间复杂度和稳定性

void bubble_sort(int arr[], int n);

解答:

稳定性:稳定,

时间复杂度:比较(n-1)+(n-1)+(n-3)+……+1=n*(n/2)=O(n^2)

交换:最好情况,不交换,最坏情况O(n^2)==比较

一般情况:O(n^2)

空间复杂度:O(1)

void bubble_sort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = i + 1; j < n; j++) {     //相等的元素不发生交换,稳定//如果 arr[i]<arr[j]  swapif (arr[i] < arr[j]) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}
}

答案:

void bubble_sort(int arr[], int n) {for (int i = 1; i < n; i++) { // i表示第几次冒泡bool isSorted = true;  // 比较arr[j]和arr[j+1]for (int j = 0; j < n - i; j++) {if (arr[j] > arr[j + 1]) {SWAP(arr, j, j + 1);isSorted = false;	// 发生交换,说明数组还未排好序}}if (isSorted) break;}
}
分析:1. 时间复杂度:最好情况:原数组有序, O(n)比较次数:n-1交换次数:0最坏情况:原数组逆序, O(n^2)比较次数:(n-1) + (n-2) + ... + 1交换次数:(n-1) + (n-2) + ... + 1平均情况:O(n^2) (和插入排序的分析方法一致)比较次数:大于等于交换的次数,小于等于 n(n-1)/2交换次数:n(n-1)/4 (等于逆序度)2. 空间复杂度:O(1)不需要申请额外的数组3. 稳定性:稳定交换的是相邻两个元素,而且只交换逆序对。

03:请实现插入排序,并分析它的时间复杂度,空间复杂度和稳定性

void insertion_sort(int arr[], int n);

解答:

稳定性:稳定,

时间复杂度:比较(n-1)

交换:最好情况,不交换,最坏情况+(n-1)+(n-3)+……+1=n*(n/2)=O(n^2)

一般情况:O(n^2)

空间复杂度:O(1)

void insertion_sort(int arr[], int n) {//第一个元素看作有序数列,从第二个元素开始插入for (int i = 1; i < n; i++) {//保留要插入的值int val = arr[i];int j = i - 1;while (j >= 0 && arr[j] > val) {  //遇到相等的元素,插在后面,不进入循环arr[j + 1] = arr[j];j--;}//arr[j]<=val||j==-1arr[j + 1] = val;}
}

答案:

void insertion_sort(int arr[], int n) {for (int i = 1; i < n; i++) { // i:待插入元素的索引// 保存待插入的元素int value = arr[i];int j = i - 1;while (j >= 0 && arr[j] > value) {arr[j + 1] = arr[j]; // 逻辑上的交换操作j--;}// j == -1 || arr[j] <= valuearr[j + 1] = value;}
}

04:请实现归并排序,并分析它的时间复杂度,空间复杂度和稳定性

void merge_sort(int arr[], int n);

解答:

稳定性:稳定,

时间复杂度:O(n)

空间复杂度:O(n)

int temp[N];
void m_sort(int arr[], int left, int right, int mid) {//比较左边和右边区间,小的加入数组int i = left;int i_left = left; int i_right = mid+1;while (i_left <= mid && i_right <= right) {if (arr[i_left] <= arr[i_right]) {  //两边相等,插左边区间进数组temp[i++] = arr[i_left++];}else{temp[i++] = arr[i_right++];}}//i_left>mid ||  i_right>rightwhile (i_left <= mid) {temp[i++] = arr[i_left++];}while (i_right <= right) {temp[i++] = arr[i_right++];}//i==Nfor (int j = right; j>=left; j--) {arr[j] = temp[j];}}
void merge_sort_help(int arr[], int left, int right) {if (left>=right)  //1个0个,有序return;//排序左边区间//排序右边区间//归并//int mid = left + (right-left >> 1);int mid = (left + right) / 2;merge_sort_help(arr, left, mid);//[0,mid]   merge_sort_help(arr, mid+1, right);//[mid+1,right]m_sort(arr, left, right, mid);
}
void merge_sort(int arr[], int n) {//外包merge_sort_help(arr, 0, n - 1);
}

答案:

int tmp[10];void merge(int arr[], int left, int mid, int right) {int i = left, j = left, k = mid + 1;// 两个区间都有元素while (j <= mid && k <= right) {if (arr[j] <= arr[k]) {		// Caution: 不能写成 arr[j] < arr[k], 就不稳定了tmp[i++] = arr[j++];} else {tmp[i++] = arr[k++];}} // j > mid || k > right// 左边区间有元素while (j <= mid) {tmp[i++] = arr[j++];}// 右边区间有元素while (k <= right) {tmp[i++] = arr[k++];}// 将tmp数组中的元素,复制到原数组的对应区间for (int i = left; i <= right; i++) {arr[i] = tmp[i];}
}void m_sort(int arr[], int left, int right) {// [left, right] 归并排序// 边界条件if (left >= right) return;// 递归公式int mid = left + (right - left >> 1);m_sort(arr, left, mid);m_sort(arr, mid + 1, right);merge(arr, left, mid, right);print_array(arr, 10);
}void merge_sort(int arr[], int n) {// 委托m_sort(arr, 0, n - 1);  // [0, n-1]
}

05:请实现快速排序,并分析它的时间复杂度,空间复杂度和稳定性

void quick_sort(int arr[], int n);

解答:

稳定性:不稳定,

时间复杂度:最坏,O(n^2)  可以避免,
最好O(nlogn) 平均O(nlogn)

空间复杂度:栈的使用空间,O(nlogn)

int partition(int arr[], int left, int right) {int pivot = arr[left];int i = left, j = right;//i下一个小于基准值的树,J下一个大于基准值的数while (j>i) {//j,J找到小于基准值的数,覆盖I的位置while (j>i&&arr[j] >= pivot) {j--;}arr[i] = arr[j];//i,i找到da于基准值的数,覆盖j的位置while (j > i && arr[i]<=pivot) {i++;}arr[j] = arr[i];}//i==jarr[i] = pivot;return i;
}
void q_sort(int arr[], int left, int right) {if (left >= right)return;//基准值最终位置int idx = partition(arr, left, right);//排序左边[left,idx-1]q_sort(arr, left, idx - 1);//排序右边[idx+1,right]q_sort(arr,  idx + 1,right);
}
void quick_sort(int arr[], int n) {//外包q_sort(arr, 0, n - 1);
}

答案:

int partition(int arr[], int left, int right) {// 选取基准值int pivot = arr[left];// 双向分区int i = left, j = right;while (i < j) {// 移动j, 找第一个比pivot小的元素while (i < j && arr[j] >= pivot) {j--;} // i == j || arr[j] < pivotarr[i] = arr[j];// 移动i,找第一个比pivot大的元素while (i < j && arr[i] <= pivot) {i++;} // i == j || arr[i] > pivotarr[j] = arr[i];} // i == jarr[i] = pivot;return i;
}void q_sort(int arr[], int left, int right) {// [left, right]// 边界条件if (left >= right) return;// 递归公式// 对[left, right]区间分区, idx是分区后基准值所在的位置int idx = partition(arr, left, right);print_array(arr, 10);q_sort(arr, left, idx - 1);q_sort(arr, idx + 1, right);
}void quick_sort(int arr[], int n) {q_sort(arr, 0, n - 1);	// [0, n-1]
}

06:给定一个排好序的数组,请设计一个算法将数组随机打乱。

void shuffle(int arr[], int n)

解答:

void shuffle(int arr[], int n) {srand(time(NULL));int j;for (int i = 0; i < n; i++) {j = rand() % (n - 1);  //0-n-1int temp=arr[i];arr[i] = arr[j];arr[j] = temp;}
}

答案:

好好好,和AI是一样的貌似

#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define SWAP(arr, i, j) {	\int tmp = arr[i];		\arr[i] = arr[j];		\arr[j] = tmp;			\
}#define SIZE(a) (sizeof(a) / sizeof(a[0]))void shuffle(int arr[], int n) {srand(time(NULL));for (int i = 0; i < n - 1; i++) {// [i, n-1]int j = rand() % (n - i) + i;SWAP(arr, i, j);}
}void print_array(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main(void) {int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };shuffle(arr, SIZE(arr));print_array(arr, SIZE(arr));return 0;
}

———————————————————————————————————————————

01:请实现堆排序,并分析它的时间复杂度,空间复杂度和稳定性

void heap_sort(int arr[], int n);

解答:

void heapify(int arr[], int i ,int len) {while (i < len) { //len--int lchild = 2 * i + 1;int rchild = 2 * i + 2;int maxIdx = i;if (lchild<len && arr[lchild]>arr[maxIdx]) {maxIdx = lchild;}if (rchild<len && arr[rchild]>arr[maxIdx]) {maxIdx = rchild;}if (maxIdx == i) { break; } //调整完成SWAP(arr, i, maxIdx);//maxIdx=lchild || rchild   比原来大捏i = maxIdx;}//i>=len,maxIdx==i
}
void heap_build(int arr[], int n) {//2*i+1<=n-1  n>i-2>>1    挨个for (int i = n - 2 >> 1; i >= 0; i--) {heapify(arr, i, n);}//i<0
}
void heap_sort(int arr[], int n) {//构建大顶堆heap_build(arr, n);int len = n;while (len > 1) {//交换第一个元素和 无序区最后一个元素SWAP(arr, 0, len - 1);len--;heapify(arr, 0, len);  //重新调整无序区}//len==1;
}

答案:

// i: 可能违反大顶堆规则的结点,并且它的左右子树都是大顶堆
// n: 逻辑上堆的长度
// 时间复杂度:O(logn)
void heapify(int arr[], int i, int n) {while (i < n) {int lchild = 2 * i + 1;int rchild = 2 * i + 2;// 求i, lchild, rchild的最大值int maxIdx = i;if (lchild < n && arr[lchild] > arr[maxIdx]) {maxIdx = lchild;}if (rchild < n && arr[rchild] > arr[maxIdx]) {maxIdx = rchild;}if (maxIdx == i) break;SWAP(arr, i, maxIdx);i = maxIdx;}
}void build_heap(int arr[], int n) {// 从后往前构建, 找第一个非叶子结点// lchild(i) = 2i+1 <= n-1// i <= (n-2)/2for (int i = n - 2 >> 1 ; i >= 0; i--) {heapify(arr, i, n);}
}void heap_sort(int arr[], int n) {build_heap(arr, n);		// O(n)print_array(arr, n);int len = n;	// 无序区的长度while (len > 1) {// 交换堆顶元素和无序区的最后一个元素SWAP(arr, 0, len - 1);len--;heapify(arr, 0, len); // 0: 可能违反堆规则的结点,这个结点的左右子树都是大顶堆// len: 逻辑上堆的大小print_array(arr, n);} // len == 1
}

02:给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
bool isValidBST(struct TreeNode* root) {}

解答:

答案:

struct TreeNode* max; // 记录遍历结点中的最大结点bool validate(struct TreeNode* root) {// 边界条件if (root == NULL) return true;// 验证左子树if (!validate(root->left)) return false;// 验证根结点if (max != NULL && max->val >= root->val) return false; max = root;  // 将根结点设为最大结点return validate(root->right); // 验证右子树
}bool isValidBST(struct TreeNode* root) {max = NULL;return validate(root);
}

03:请实现下列二分查找的变种:

// 查找最后一个与 key 相等的元素
int binary_search1(int arr[], int n, int key);
// 查找最后一个小于等于 key 值的元素
int binary_search2(int arr[], int n, int key);

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE(arr) (sizeof(arr)/sizeof(arr[0]))// 查找最后一个与 key 相等的元素
int binary_search1(int arr[], int n, int key) {int left = 0;int right = n - 1;//比较,小于KEY,rigth动,大于,LEFTdong1while (left <= right) {int mid = left + (right - left >> 1);int cmp = key - arr[mid];if (cmp < 0) {right = mid - 1;}else if (cmp > 0) {left = mid + 1;}else {   //后一个元素大于key,可能没有后一个元素||最后一个元素大于等于while (mid < right && arr[mid + 1] <= key) {right = mid - 1;}//mid==right || arr[mid+1]>keyif (mid == right) { return mid; }else { return mid + 1; }}}return -1;
}
// 查找最后一个小于等于 key 值的元素
int binary_search2(int arr[], int n, int key) {int left = 0;int right = n - 1;//都比key小,返回N-1,都比KEY大,-1.while (left <= right) {int mid = left + (right - left >> 1);int cmp = key - arr[mid];   //   left  mid    right  if (cmp < 0) {right = mid - 1;}else if (cmp > 0) {if (arr[left + 1] > key) { return left; }left = mid + 1;}else {   //mid向right靠近while (mid <= right && arr[mid + 1] <= key) {   //mid<=right  arr[right]也要进行比较mid++;}//mid==right|| arr[mid+1]>keyreturn mid;}}return -1;
}int main(void) {int arr[] = { 10,20,20,20,30,30,40,50,50,50,50,60,70,100,100,100,1001,1001,1200 };//int y01=binary_search1(arr,SIZE(arr),12);  int y01 = binary_search2(arr, SIZE(arr), 30);return 0;
}

答案:

// 查找最后一个与 key 相等的元素
int binary_search1(int arr[], int n, int key) {int left = 0, right = n - 1;while (left <= right) {int mid = left + (right - left >> 1);int cmp = key - arr[mid];if (cmp < 0) {right = mid - 1;} else if (cmp > 0) {left = mid + 1;} else {if (mid == right || arr[mid + 1] > key) {return mid;}left = mid + 1;}}return -1;
}// 查找最后一个小于等于 key 值的元素
int binary_search2(int arr[], int n, int key) {int left = 0, right = n - 1;while (left <= right) {int mid = left + (right - left >> 1);int cmp = arr[mid] - key;if (cmp <= 0) {if (mid == right || arr[mid + 1] > key) {return mid;}left = mid + 1;} else {right = mid - 1;}}return -1;
}

04:用 fread/fwrite 实现文件的复制。

// copyFile.c
int main(int argc, char* argv[]);​

解答:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE(a) (sizeof(a)/sizeof(a[0]))int main(int argc, char* argv[]) {if (argc != 3) {printf("error,\n");exit(1);}//打开源文件FILE* mam = fopen(argv[1], "rb");if (!mam) {printf("error,\n");exit(1);}//打开目标文件FILE* son = fopen(argv[2], "wb");if (!son) {printf("error,\n");fclose(mam);exit(1);}//复制char buffer[75000];int n;while ((n=fread(buffer, 1, SIZE(buffer), mam)) != 0) {fwrite(buffer, 1, n, son);}fclose(mam);fclose(son);return 0;
}/*
用 fread/fwrite 实现文件的复制。
// copyFile.c
int main(int argc, char* argv[]);​*/

答案:

int main(int argc, char* argv[]) {// 打开文件流FILE* src = fopen(argv[1], "rb");if (!src) {fprintf(stderr, "Open %s failed.\n", argv[1]);exit(1);}FILE* dst = fopen(argv[2], "wb");if (!dst) {fclose(src);fprintf(stderr, "Open %s failed.\n", argv[2]);exit(1);}char buffer[4096];  // 4k, buffer的就是块的大小int n;while ((n = fread(buffer, 1, 4096, src)) > 0) {	// 实际读取了n个元素fwrite(buffer, 1, n, dst);}// 关闭文件流fclose(src);fclose(dst);return 0;
}

———————————————————————————————————————————

001:将一个文件读入程序,将其中的大小写字母右旋13个位置后,写入另一个文件。

[A-Ma-m] 转换成 [N-Zn-z]

[N-Zn-z] 转换成 [A-Ma-m]

其余字符不变

int main(int argc, char* argv[]) {}

解答:

//请实现下面功能将一个文件读入程序,将其中的大小写字母右旋13个位置后,写入另一个文件。
void right_handed(FILE* str1, FILE* str2) {//打开文件FILE* source = fopen(str1,"rb");if (!source) {perror("source\n");exit(1);}FILE* right = fopen(str2, "wb");if (!right) {perror("right\n");exit(1);}//逐字符读入,字符判断,右旋。写入目标文件int a;while ((a = fgetc(source)) != EOF) {if ((a <= 'M' && a >= 'A') || (a <= 'm' && a >= 'a')) {fputc(a+13, right);}else if ((a <= 'Z' && a >= 'N') || (a <= 'z' && a >= 'n')) {fputc(a - 13, right);}else {fputc(a, right);}}fclose(source);fclose(right);
}

002:将一个文件读入程序,在每一行前面添加序号,然后写入另一个文件。如:

Allen
Beyonce
Cindy
Dianna

变成

1. Allen
2. Beyonce
3. Cindy
4. Dianna

解答:

void add_num(FILE* str1, FILE* str2) {FILE* source = fopen(str1, "r");if (!source) {perror("source\n");exit(1);}FILE* add_num = fopen(str2, "w");if (!add_num) {perror("add_num\n");exit(1);}//行读取  s输出char massage1[MAXLINE];int line = 0;while (fgets(massage1, MAXLINE, source) != NULL) {line++;fprintf(add_num,"%d.%s",line,massage1);//写入字符串数组}fclose(source);fclose(add_num);
}

003:然后将规范化处理的学生信息,写入新的文件 students.dat.

1 Allen f 100 100 100
2 Beyonce f 90 90 90
3 Cindy f 95 95 95
4 Dianna f 98 98 98

字段的含义分别是:学号、姓名、性别、语文、数学、英语。现在需要对分数进行规范化处理,每个同学的语文成绩需要乘以 0.85,数学成绩乘以 0.9,英语成绩乘以 0.8。然后将规范化处理的学生信息,写入新的文件 students.dat.

解答:

void stu_information(FILE* str1, FILE* str2) {FILE* before = fopen(str1, "r");if (!before) {perror("before\n");exit(1);}FILE* after = fopen(str2, "w");if (!after) {perror("after\n");exit(1);}//标准化输入Stu s;while (1) {  //返回转换说明的个数int n = fscanf(before, "%d%s %c%d%d%d",&s.id,s.name,&s.gender,&s.chinese,&s.math,&s.english);if (n != 6) { break; }n++;s.chinese *= 0.8;s.math *= 0.9;s.english *= 0.7;fprintf(after,"%3d %10s %2c %3d %3d %3d\n",s.id,s.name,s.gender,s.chinese,s.math,s.english);}fclose(before);fclose(after);
}

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

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

相关文章

ubuntu,linux下屏蔽坏块方法-240625-240702封存

在windows下的屏蔽坏道的方法 机械硬盘坏道的文件系统级别的屏蔽方法_硬盘如何屏蔽坏扇区-CSDN博客 https://blog.csdn.net/cyuyan112233/article/details/139408503?spm1001.2014.3001.5502 【免费】磁盘坏道屏蔽工具磁盘坏道屏蔽工具_机械硬盘屏蔽坏扇区资源-CSDN文库 https…

第一周题目总结

1.车尔尼有一个数组 nums &#xff0c;它只包含 正 整数&#xff0c;所有正整数的数位长度都 相同 。 两个整数的 数位不同 指的是两个整数 相同 位置上不同数字的数目。 请车尔尼返回 nums 中 所有 整数对里&#xff0c;数位不同之和。 示例 1&#xff1a; 输入&#xff1a…

【嵌入式DIY实例-ESP8266篇】-LCD ST7735显示网络时间

LCD ST7735显示网络时间 文章目录 LCD ST7735显示网络时间1、硬件准备2、代码实现本文将介绍如何使用 ESP8266 NodeMCU Wi-Fi 板实现互联网时钟,其中时间和日期显示在 ST7735 TFT 显示屏上。 ST7735 TFT是一款分辨率为128160像素的彩色显示屏,采用SPI协议与主控设备通信。 1…

Python中的变量和数据类型:Python中有哪些基本数据类型以及变量是如何声明的

在Python中&#xff0c;变量是用来存储数据的容器&#xff0c;而数据类型则定义了这些数据的种类。Python是一种动态类型语言&#xff0c;这意味着你不需要在声明变量时指定其类型&#xff1b;Python解释器会在运行时自动确定变量的类型。 Python中的基本数据类型 Python中有…

SQL语句(DML)

DML英文全称是Data Manipulation Language&#xff08;数据操作语言&#xff09;&#xff0c;用来对数据库中表的数据记录进行增删改等操作 DML-添加数据 insert into employee(id, workno, name, gender, age, idcard) values (1,1,Itcast,男,10,123456789012345678);select *…

AI 与数据的智能融合丨大模型时代下的存储系统

WOT 全球技术创新大会2024北京站于 6 月 22 日圆满落幕。本届大会以“智启新纪&#xff0c;慧创万物”为主题&#xff0c;邀请到 60 位不同行业的专家&#xff0c;聚焦 AIGC、领导力、研发效能、架构演进、大数据等热门技术话题进行分享。 近年来&#xff0c;数据和人工智能已…

记录搭建一台可域名访问的HTTPS服务器

一、背景 近期公司业务涉及到微信小程序&#xff0c;即将开发完成需要按照微信小程序平台的要求提供带证书的域名请求服务器。 资源背景介绍如下&#xff1a; 1、域名 公司已有一个二级域名&#xff0c;再次申请新的二级域名并且实现ICP备案不仅需要花重金重新购买&#xff0c;…

Docker实现Redis主从,以及哨兵机制

Docker实现Redis主从,以及哨兵机制 目录 Docker实现Redis主从,以及哨兵机制准备Redis镜像创建Redis主节点配置文件启动Redis从节点确认主从连接哨兵主要功能配置哨兵文件创建Redis哨兵的Docker容器 要通过Docker实现Redis的主从&#xff08;master-slave&#xff09;复制&#…

汽车EDI: BMW EDI项目案例

宝马集团是全世界成功的汽车和摩托车制造商之一&#xff0c;旗下拥有BMW、MINI和Rolls-Royce三大品牌&#xff1b;同时提供汽车金融和高档出行服务。作为一家全球性公司&#xff0c;宝马集团在14个国家拥有31家生产和组装厂&#xff0c;销售网络遍及140多个国家和地区。 本文主…

什么是 Socks5 代理?了解和使用 SOCKS5 代理的终极指南

SOCKS5是什么以及它如何工作&#xff1f; 在网络和互联网协议领域&#xff0c;有多种工具和技术在确保安全高效的通信方面发挥着至关重要的作用。 SOCKS5 就是这样一个工具&#xff0c;它代表套接字安全版本 5。 在这篇博文中&#xff0c;我们将深入探讨 SOCKS5 的细节&…

CoAtNet(NeurIPS 2023, Google)论文解读

paper&#xff1a;CoAtNet: Marrying Convolution and Attention for All Data Sizes third-party implementation&#xff1a;https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/maxxvit.py 背景 自AlexNet以来&#xff0c;ConvNets一直是计算机…

【基于R语言群体遗传学】-5-扩展到两个以上等位基因及多基因位点

我们现在继续对于群体遗传学进行统计建模&#xff0c;书接上回&#xff0c;我们讨论了孤雌生殖的物种违反哈代温伯格遗传比例的例子&#xff0c;那我们现在来看多于两个等位基因的情况的计算。 如果没有看过之前文章的同学&#xff0c;可以先去看一下之前的文章&#xff1a; …

开源租房项目

项目名称项目地址描述体验地址后端代码前端代码小程序端代码gitHubstart租房或房屋交易项目https://github.com/saysky/manland?tabreadme-ov-filePC端 管理端http://manland.liuyanzhao.com/有有无房适–房屋租赁管理平台https://github.com/LiuXIn011/rightHouse开源房屋管理…

非对称加密算法原理与应用1——秘钥的生成

作者:私语茶馆 1.前言 非对称算法有非常多的用途,实现license管控,数字签名,加密内容等等,由于涉及场景和标准非常多,因此实际使用过程中还是存在一定门槛,这里记录一下利用非对称算法RSA的应用关键点,并提供实现license管理的案例。预计拆分为以下几个章节: (1)秘…

Apipost接口测试工具的原理及应用详解(三)

本系列文章简介: 随着软件行业的快速发展,API(应用程序编程接口)作为不同软件组件之间通信的桥梁,其重要性日益凸显。API的质量直接关系到软件系统的稳定性、性能和用户体验。因此,对API进行严格的测试成为软件开发过程中不可或缺的一环。在众多API测试工具中,Apipost凭…

【分布式数据仓库Hive】HivQL的使用

目录 一、Hive的基本操作 1. 使用Hive创建数据库test 2. 检索数据库&#xff08;模糊查看&#xff09;&#xff0c;检索形如’te*’的数据库 3. 查看数据库test详情 4. 删除数据库test 5. 创建一个学生数据库Stus&#xff0c;在其中创建一个内部表Student&#xff0c;表格…

ubuntu20.04在anaconda环境下不能使用catkin_make

ubuntu20.04在anaconda环境下不能直接使用catkin_make编译&#xff0c;报错显示需要安装python3-empy 这时候查询会发现该软件包已经安装了&#xff0c;但是是在ROS环境中&#xff0c;安装anaconda环境后python解释器的指向变了&#xff0c;所以需要在anaconda环境中再装pytho…

Unity udp通信详解

在Unity中实现UDP通信&#xff0c;需要使用C#的System.Net和System.Net.Sockets命名空间。UDP&#xff08;用户数据报协议&#xff09;是一种无连接的网络协议&#xff0c;它允许数据包在网络上发送和接收&#xff0c;但不保证数据包的到达顺序、完整性或可靠性。这使得UDP非常…

沃德校园助手丨校园跑腿-校园外卖-校园论坛三合一系统

校园跑腿项目其实由来已久&#xff0c;由于大学校园生活的特殊性&#xff0c;除了日常的课程学习之外&#xff0c;大学生的所有生活基本长期处于全模式形态下的校园封闭环境中&#xff0c;再加之当前大学生一部分学业繁忙&#xff0c;办事不便。另一部分自理能力较差&#xff0…

【kafka】可视化工具cmak(原kafka-manager)安装问题解决

众所周知&#xff08;反正不管你知不知道&#xff09;&#xff0c;kafka-maneger更名了&#xff0c;现在叫cmak&#xff01;原因是什么呢&#xff1f;据不可靠小道信息说&#xff0c;原kafka-manager这个名字涉及到kafka商标使用问题&#xff0c;应该是被律师函警告了&#xff…