數據結構--【順序表與鏈表】筆記

順序表

template <class T>
class arrList :public List<T> //表示 arrList 類以公有繼承的方式繼承自 List<T> 類
//公有繼承意味著 List<T> 類的公共成員在 arrList 類中仍然是公共成員,受保護成員在 arrList 類中仍然是受保護成員。
{
private:T* aList;  //存儲順序表的實例,以后可以直接拿aList[]當數組用int maxSize;int curLen;   //順序表的當前長度int position;  //當前處理位置
public:arrList(const int size){maxSize = size;aList = new T[maxSize];curlen = position = 0;}~arrList(){delete[] aList;}void clear(){delete[] aList;curLen = position = 0;aList = new T[maxSize];}//查找操作bool arrList<T>::getPos(int& p, const T value){for (int i = 0; i <= curLen; i++){if (aList[i] == value){p = i;return true;}}return false;}//插入操作bool arrList <T> ::insert(const int p, const T value){if (curLen >= maxSize)  //檢測當前數組是否越界{ cout << "overflow";  return false;}if (p<0 || p>curLen)   //檢測插入位置是否合法{cout << "illegal";return false;}for (int i = curLen; i > p; i--){aList[i] = aList[i = 1];}aList[p] = value;curLen++;return true;}//刪除操作bool arrList<T> ::delete(const int p){if (curLen <= 0)  //判斷元素是否為空,空表不能刪除{cout << "no element to delete \n"<<endl;return false;}if (p<0 || p>curLen-1)  //注意這里是p>curLen-1不是curLen{cout << "illegal";return false;}for (int i = p; i < curLen-1; i++){aList[i] = aList[i + 1];}curLen--;//這里不需要再對aList[curLen-1]進行清零,因為curLen長度已經減小了//最后一個元素不在操作范圍內return false;}
};

鏈表?

單鏈表

head 是指向單鏈表開始結點的指針,tail 是指向單鏈表尾結點的指針,對鏈表的訪問只能通過頭尾指針進行操作

頭結點:虛擬結點,值被忽略,不被看做表中的實際元素,避免對空表的處理

操作分別有:

  1. 結點的定義
  2. 單鏈表的類型定義
  3. 定義鏈表的構造函數和析構函數
  4. 鏈表的檢索
  5. 鏈表的插入操作
  6. 鏈表的刪除操作?

說明:Link是模板類,代表著結點

lnkList是單鏈表類,里面存儲著管理鏈表的方法以及首尾指針?

template <class T> class Link  //代表鏈表中的一個結點
{
public:T data;  //保存結點的內容Link<T>* next;  //指向后繼結點的指針(指向Link類的指針)//函數重載,一個是有一個參數的,另一個是有兩個參數的Link(const T info, const Link<T>* nextValue = NULL)//既有下一個結點的地址,又有data//這里是默認值為NULL,即當只傳入data時,默認為最后一個結點{data = info;next = nextValue;}Link(const Link<T>* nextValue)//只指向下一個結點的指針,但是并沒有值{next = nextValue;}
};
//單鏈表的類型定義
//在定義模板類時,必須在類名之前加上模板參數聲明template <class T>
template <class T> class lnkList:public List<T>
{
private:Link<T>* head, * tail;Link<T>* setPos(const int p);   //返回線性表指向第p個元素的指針值
public:lnkList(int s);~lnkList();bool isEmpty();...bool getPos(int& p, const T value);
};
//帶有頭結點的單鏈表的構造函數和析構函數
template<class T> lnkList<T>::lnkList(int defSize)
//在類外定義函數的時候要把模板類寫完整了,加上<T>
{head = tail = new Link<T>;
}
template <class T> lnkList<T>::~lnkList()
{Link<T>* tmp;while (head != NULL){tmp = head;head = head->next;delete tmp;
//要先將head值給tmp(注意這里是指針的關系),然后再讓head等于下一個指針
//刪除了tmp也就相當于刪除了第一個head
//如果直接delete head就會喪失對下一個結點的訪問權}
}
//鏈表的檢索
template <class T> Link<T>* lnkList<T>::setPos(int i)
{int count = 0;if (i == -1) return head;Link<T>* p = head->next;  //創建一個新結點,p指針是一個指向Link類型變量的指針,//在這個Link類型變量中是while (p != NULL && count < i){p = p->next;count++;}return p;
}
//鏈表的插入
template <class T> bool lnkList<T> ::insert(const int i, const T value)
{Link<T>* p,*q;//調用 setPos 函數找到插入位置的前一個節點if ((p = setPos(i - 1)) == NULL){cout << "非法插入點";return false;}q = new Link<T>(value, p->next); //q是新構建的結點p->next = q; //將新的q結點插入至p結點之后,也就是說p是q的上一個結點if (p == tail)tail = q;return true;
}
//鏈表的刪除
template <class T> bool lnkList<T>::delete(const int i)
{Link<T>* p, * q;if ((p = setPos(i - 1)) == NULL || p == tail){cout << "非法刪除點";return false;}q = p->next;//q是真正的待刪結點if (q == tail){tail = p;p->next = NULL;delete q;}else if (q != NULL){p->next = q->next;delete q;}return true;
}

鏈表實驗題

順序表做法

偶遇順序表難題,用指針+結構體做拼盡全力無法戰勝,用數組做十分鐘輕松戰勝(但是sstream學了一陣子)

#include<iostream>
#include<cmath>
#include<sstream>
using namespace std;
int a[10000], b[10000];
int main()
{string line1, line2;getline(cin, line1);getline(cin, line2);stringstream ss1(line1);stringstream ss2(line2);int m, n;//m是系數,n是指數while (ss1 >> m >> n){a[n] = m;}while (ss2 >> m >> n){b[n] = m;}int len = max(sizeof(a) / 4, sizeof(b) / 4);for (int i = 0; i < len; i++){a[i] += b[i];}for (int i = len - 1; i >= 0; i--){if (a[i] == 0)   continue;cout << a[i] << " " << i << " ";}return 0;
}

鏈表做法

#include<iostream>
#include<cmath>
#include<sstream>
using namespace std;
class node
{int data;node* next;node(const int info,node* nextnode){data = info;next = nextnode;}node(node* nextnode){next = nextnode;}
};
class list {};
int main()
{}
#include<iostream>
#include<cmath>
#include<sstream>
using namespace std;
struct node  //創建新結點
{int m;//系數int n;//指數node* next;node(int a, int b){m = a;n = b;next = nullptr;}
};
node* creat()//創建多項式列表
{node* head = nullptr;  //表示指向第一個結點的指針node* tail = nullptr;  //表示當前最新結點的指針,等全部錄入完畢就是指向最后一個結點string ss1;getline(cin, ss1);stringstream sss(ss1);int a, b;while (sss >> a >> b){
//每次新建一個結點,給它一個新的指針node* newnode = new node(a, b);  //返回內存地址if (!head) head = tail = newnode;else{
//假設原來鏈表為A-->B-->C,此時tail指向C,當執行ail->next = newnode時候將C和新結點D連接在一起,
// 鏈表變成A-->B-->C-->D,然后再把tail更新成最新的D			tail->next = newnode; tail = newnode;}}return head;  //返回頭指針就是返回整條鏈表
}
node* add(node* f1, node* f2) {node index(0, 0);node* tail = &index;while (f1 && f2) {if (f1->n > f2->n) {
//經典操作,同創建鏈表里頭的tail->next = f1;tail = tail->next;f1 = f1->next;}else if (f1->n < f2->n) {tail->next = f2;tail = tail->next;f2 = f2->next;}else {
//如果相等的話就復雜了int sum = f1->m + f2->m;node* tmp1 = f1;node* tmp2 = f2;
//先都往后移動一個結點f1 = f1->next;f2 = f2->next;if (sum != 0) {tmp1->m = sum;
//經典操作,連接新結點tmp1并更新tailtail->next = tmp1;tail = tail->next;tail->next = nullptr; // 防止遺留指針,相當于切斷了和原來鏈的聯系
//假設 f1 鏈表為 A(系數 3, 指數 2) -> B(系數 1, 指數 1),f2 鏈表為 C(系數 2, 指數 2) -> D(系數 4, 指數 1)。
// 當處理到指數為 2 的節點 A 和 C 時,系數相加結果為 3 + 2 = 5,將 A 的系數更新為 5 并連接到新鏈表尾部。
// 如果不將 tail->next 置為 nullptr,A 原本的 next 指針仍然指向 B,這會導致新鏈表中在 A 后面錯誤地連接了 B,
// 而后續可能會繼續錯誤地處理這些遺留節點。}else {delete tmp1;}
//tmp2總是要刪的delete tmp2;}}
//其實后面 f1?f1:f2 才是一個整體,如果f1存在,那么就接上f1的值tail->next = f1 ? f1 : f2;
//返回首結點的地址return index.next;
};void print(node* f1)
{node* cur = f1;bool first = true;while (cur){if (!first){cout << " ";}cout << cur->m << " " << cur->n;first = false;cur = cur->next;}
}
void free(node* f)
{while (f){node* tmp = f;f = f->next;delete tmp;}
}
int main()
{node* f1 = creat();node* f2 = creat();node* summ = add(f1, f2);print(summ);free(summ); free(f1);free(f2);return 0;
}

鏈表實驗選做題

?照葫蘆畫瓢總算出來一個,但是需要逆序輸出,但是爺爺懶得寫直接存個數組里頭逆序輸出了hhh

#include<iostream>
#include<sstream>
using namespace std;struct node
{int data;node* next;node(int a){data = a;next = nullptr;}
};
node* creat()
{node* head=nullptr;node* tail=nullptr;string s;getline(cin, s);stringstream ss(s);int a;while (ss >> a){node* newnode = new node(a);if (!head) head = tail = newnode;else {tail->next = newnode;tail = newnode;}}return head;
}
node* order(node* f1, node* f2)
{node index(0);node* tail = &index;while (f1 && f2){if (f1->data < f2->data){tail->next = f1;tail = tail->next;f1 = f1->next;}else if (f1->data > f2->data){tail->next = f2;tail = tail->next;f2 = f2->next;}else{f1 = f1->next;f2 = f2->next;tail->next = f1;tail = tail->next;tail->next = f2;tail = tail->next;}}tail->next= f1 ? f1 : f2;return index.next;
}
void print(node* head)
{int count = 0;int a[100000] = { 0 };node* tail = head;while (tail){count++;a[count] = tail->data;tail = tail->next;}for (int i = count; i >= 1; i--) cout << a[i] << " ";
}
void free(node* f)
{while (f){node* cur = f;f = f->next;delete cur;}
}
int main()
{node* f1 = creat();node* f2 = creat();node* result = order(f1, f2);print(result);free(result);return 0;
}

洛谷 單向鏈表

題目描述

實現一個數據結構,維護一張表(最初只有一個元素?1)。需要支持下面的操作,其中?x?和?y?都是?1?到?106?范圍內的正整數,且保證任何時間表中所有數字均不相同,操作數量不多于?105:

  • 1 x y?:將元素?y?插入到?x?后面;
  • 2 x?:詢問?x?后面的元素是什么。如果?x?是最后一個元素,則輸出?0;
  • 3 x:從表中刪除元素?x?后面的那個元素,不改變其他元素的先后順序。

輸入格式

第一行一個整數?q?表示操作次數。

接下來?q?行,每行表示一次操作,操作具體見題目描述。

輸出格式

對于每個操作 2,輸出一個數字,用換行隔開。

輸入輸出樣例

輸入?

6
1 1 99
1 99 50
1 99 75
2 99
3 75
2 1

輸出

75
99

一開始寫的完美無瑕的代碼結果T了兩個點

#include<iostream>
#include<sstream>
using namespace std;
struct node
{int data;node* next;node(int n){data = n;next = nullptr;}
};
node* setpos(node* head,int x)  
{node* cur = head;while (cur->data != x){cur = cur->next;}return cur;
}
node* insert(node* head,int x,int y)
{node* cur = setpos(head, x);node* cur2 = cur->next;node* newnode=new node(y);newnode->next = cur2;cur->next = newnode;return head;
}
node* remove(node* head,int x)
{node* cur = setpos(head, x);node* cur1 = cur->next;	cur->next=cur1->next;delete cur1;return head;
}
void print(node* curnode)
{cout <<curnode->data<<endl;
}
void free(node* head)
{while (head){node* tmp = head;head = head->next;delete tmp;}
}
int main()
{int n,k,x,y;cin >> n;node* index = new node(1);node* cur = nullptr;for (int i = 0; i < n; i++){cin >> k;if (k == 1){cin >> x >> y;index = insert(index, x, y);}else if (k == 2){cin >> x;cur= setpos(index, x);cur = cur->next;if (!cur) {cout << 0<< endl; continue;}print(cur);}else if (k == 3){cin >> x;index = remove(index, x);}}free(index);return 0;
}

?那應該是還得優化,但是怎么優化呢,網上優化代碼看不懂思密達,但是我會寫數組呀嘻嘻

#include<iostream>
#include<sstream>
using namespace std;
int a[1000000];  //a[i]中i表示data,a[i]表示下一個結點的地址(就是第幾位)
void insert()
{int x, y;cin >> x >> y;a[y] = a[x];a[x] = y;
}
void remove()
{int x;cin >> x;a[x] = a[a[x]];
}
int main()
{a[1] = 0;int k,n;cin >> n;for (int i = 0; i < n; i++){cin >> k;if (k == 1) insert();if (k == 2){int x;cin >> x;if (!a[x]){cout << 0 << endl;continue;}else cout << a[x]<<endl;}if (k == 3) remove();}return 0;
}

洛谷 臨值查找

題目描述

給定一個長度為?n?的序列?A,A?中的數各不相同。

對于?A?中的每一個數?Ai?,求:

min1≤j<i?∣Ai??Aj?∣

以及令上式取到最小值的?j(記為?Pi?)。若最小值點不唯一,則選擇使?Aj??較小的那個。

輸入格式

第一行輸入整數?n,代表序列長度。

第二行輸入?n?個整數?A1?~An?,代表序列的具體數值,數值之間用空格隔開。

輸出格式

輸出共?n?1?行,每行輸出兩個整數,數值之間用空格隔開。

分別表示當?i?取?2~n?時,對應的?min1≤j<i?∣Ai??Aj?∣?和?Pi??的值。

輸入輸出樣例

輸入

3
1 5 3

輸出?

4 1
2 1

?全WA(笑)后來發現題目理解錯了,人家讓找最小的data,不是最小的id

修改后還是錯

#include<iostream>
#include<sstream>
#include<cmath>
#include<climits> //使用INT_MAX
using namespace std;
struct node
{int data;int id;node* next = NULL;node(int n,int z){data = n;id = z;}
};
void result(node* head, node* cur)
{int min_ans = INT_MAX;int index = -1;int select_val = INT_MAX;while (head != cur){int cur_data = abs(cur->data - head->data);if (cur_data< min_ans||cur_data==min_ans&&head->data<select_val){min_ans = cur_data;select_val = head->data;index = head->id;}head = head->next;}cout << min_ans << " " << index << endl;
}int main()
{int n,k;cin >> n;node* head = NULL;node* tail = NULL;bool flag = true;for (int i = 1; i <= n; i++){cin >> k;node* newnode = new node(k,i);if (!head) { head = tail = newnode; flag = false; }tail->next = newnode;tail = newnode;if(i!=1) result(head, tail);}return 0;
}

這里出現問題的在于

if (!head) { head = tail = newnode; flag = false; }tail->next = newnode;tail = newnode;

這里在首結點吧tail的next賦值newnode,造成循環鏈表,正確寫法應該是:

if (!head) { head = tail = newnode; flag = false; }else {tail->next = newnode;tail = newnode;}

全部改完以后沒問題了,但是還是T了四個點

用set優化,快速排序,這樣就不用一個一個找了

#include<iostream>
#include<sstream>
#include<cmath>
#include<set>
#include <climits> // 添加頭文件以使用INT_MAX
using namespace std;
int main()
{ios::sync_with_stdio(false);cin.tie(0);int n, val;cin >> n;set<pair<int,int>> nums;for (int i = 1; i <= n; i++){cin >> val;int min_diff = INT_MAX;//記錄最小差值int min_val = INT_MAX;//記錄最小的Ajint ans_id = -1;if (i == 1){nums.insert({ val,i });continue;}auto it = nums.lower_bound({val,0});//nums.end() 返回的末尾迭代器不指向任何有效元素if (it != nums.end()){if (abs(val - it->first) < min_diff || abs(val - it->first) == min_diff && it->first < min_val){min_diff = abs(val - it->first);min_val = val;ans_id = it->second;}}if (it != nums.begin()) {it--;if (abs(val - it->first) < min_diff || abs(val - it->first) == min_diff && it->first < min_val){min_diff = abs(val - it->first);min_val = val;ans_id = it->second;}}cout << min_diff << " " << ans_id<<'\n';nums.insert({ val,i });}return 0;
}

?學到了用set的很多知識,比如:

1.set中每一個元素的鍵值都唯一,所以在向set中插入相同的數據的時候,會插不進去

2.所有元素都會根據元素的字典序進行排序,先比較第一個,第一個一樣大就比較第二個,默認從小到大

3.迭代器聲明時用auto it=nums容器中某個元素,表示這個元素的時候就用 it->first 和 it->second 來表示

4.nums.end()返回的末尾迭代器不指向任何有效元素

5.用于解除cin和cout的綁定,加快速度防止TLE

ios::sync_with_stdio(false);
cin.tie(0);

6.set聲明:set<pair<int,int>>?

用STL寫鏈表(藍橋杯書上的)

#include<iostream>
#include<list>
using namespace std;
list<int> list1;//創建一個STLlist實例
int main()
{int n, m, x, y, z;cin >> n >> m;for (int i = 1; i <= n; i++)list1.push_back(i); //在鏈表尾部添加元素while (m --){cin >> x >> y >> z;list1.remove(x);list<int>::iterator it = find(list1.begin(), list1.end(), y);//也可以用auto it定義if (z == 0) list1.insert(++it, x);if (z == 1) list1.insert(it, x);}for (int x : list1){cout << x << " ";}cout << endl;return 0;
}

知識點:

  • list1.push_back(x):將x添加至鏈表的尾部
  • pop_back():刪除鏈表尾部元素
  • pop_front():刪除鏈表頭部元素
  • front():讀取頭部元素
  • back():讀取尾部元素
  • insert(it,x):在it位置插入元素x
  • erase(it):在it位置刪除元素,也可以用list1.remove(x)刪除x元素
  • 定義迭代器:
    list<int>::iterator it = find(list1.begin(), list1.end(), y);//也可以用auto it定義

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72785.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72785.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72785.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

idea中隱藏目錄

可能的解決步驟&#xff1a; 排除目錄的方法是否在2021版本中有變化&#xff1f;應該沒有&#xff0c;還是通過右鍵標記為排除。 用戶可能想完全隱藏目錄&#xff0c;比如在項目視圖中不顯示&#xff0c;這可能需要調整項目視圖的設置&#xff0c;比如取消勾選“顯示排除的文件…

AWS 如何導入內部SSL 證書

SSL 證書的很重要的功能就是 HTTP- > HTTPS, 下面就說明一下怎么導入ssl 證書,然后綁定證書到ALB. 以下示例說明如何使用 AWS Management Console 導入證書。 從以下位置打開 ACM 控制臺:https://console.aws.amazon.com/acm/home。如果您是首次使用 ACM,請查找 AWS Cer…

2025最新群智能優化算法:基于RRT的優化器(RRT-based Optimizer,RRTO)求解23個經典函數測試集,MATLAB

一、基于RRT的優化器 基于RRT的優化器&#xff08;RRT-based Optimizer&#xff0c;RRTO&#xff09;是2025年提出的一種新型元啟發式算法。其受常用于機器人路徑規劃的快速探索隨機樹&#xff08;RRT&#xff09;算法的搜索機制啟發&#xff0c;首次將RRT算法的概念與元啟發式…

doris: Oracle

Apache Doris JDBC Catalog 支持通過標準 JDBC 接口連接 Oracle 數據庫。本文檔介紹如何配置 Oracle 數據庫連接。 使用須知? 要連接到 Oracle 數據庫&#xff0c;您需要 Oracle 19c, 18c, 12c, 11g 或 10g。 Oracle 數據庫的 JDBC 驅動程序&#xff0c;您可以從 Maven 倉庫…

im即時聊天客服系統SaaS還是私有化部署:成本、安全與定制化的權衡策略

隨著即時通訊技術的不斷發展&#xff0c;IM即時聊天客服系統已經成為企業與客戶溝通、解決問題、提升用戶體驗的重要工具。在選擇IM即時聊天客服系統時&#xff0c;企業面臨一個重要決策&#xff1a;選擇SaaS&#xff08;軟件即服務&#xff09;解決方案&#xff0c;還是進行私…

mysql中in和exists的區別?

大家好&#xff0c;我是鋒哥。今天分享關于【mysql中in和exists的區別?】面試題。希望對大家有幫助&#xff1b; mysql中in和exists的區別? 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 在 MySQL 中&#xff0c;IN 和 EXISTS 都用于進行子查詢&#xff0c;但它…

element-plus中table組件的使用

1、table組件的基本使用 注意&#xff1a; ①對象集合&#xff0c;要從后端查詢。 ②prop是集合中的對象的屬性名&#xff1b;label是表格表頭的名稱。 2、將性別一列的71轉為男&#xff0c;72轉為女 問題描述&#xff1a; 解決步驟&#xff1a; ①將el-table-column變成雙標簽…

Django小白級開發入門

1、Django概述 Django是一個開放源代碼的Web應用框架&#xff0c;由Python寫成。采用了MTV的框架模式&#xff0c;即模型M&#xff0c;視圖V和模版T。 Django 框架的核心組件有&#xff1a; 用于創建模型的對象關系映射為最終用戶設計較好的管理界面URL 設計設計者友好的模板…

使用 display: flex 實現動態布局:每行兩個 item,單數時最后一個占滿整行

文章目錄 使用 display: flex 實現動態布局&#xff1a;每行兩個 item&#xff0c;單數時最后一個占滿整行 &#x1f3af;一、需求分析二、實現思路三、代碼實現1. HTML 結構2. CSS 樣式關鍵點解析&#xff1a; 四、效果演示HTML 示例&#xff1a;效果&#xff1a; 五、完整代碼…

preloaded-classes裁剪

系統預加載了哪些class類&#xff1f;system/etc/preloaded-classes 修改源代碼&#xff1f; frameworks\base\config\preloaded-classes 默認位置&#xff0c;如果改了不生效&#xff0c;可能有其它模塊的mk文件指定了preloaded-classes覆蓋了framework模塊&#xff0c;例如…

華為配置篇-OSPF基礎實驗

OSPF 一、簡述二、常用命令總結三、實驗3.1 OSPF單區域3.2 OSPF多區域3.3 OSPF 的鄰接關系和 LSA 置底 一、簡述 OSPF&#xff08;開放式最短路徑優先協議&#xff09; 基本定義 全稱&#xff1a;Open Shortest Path First 類型&#xff1a;鏈路狀態路由協議&#xff08;IGP&…

Orale數據文件加錯位置,你直接rm引發的故障

數據庫可能面臨硬件故障、人為錯誤、惡意攻擊、自然災害等多種潛在風險&#xff0c;那么今天這個故障就是由于業務人員加錯數據文件的位置&#xff0c;然后直接從物理層面rm -f了&#xff0c;導致了生產的故障&#xff01; 以下是針對Oracle數據庫物理刪除數據文件后的快速修復…

ChromeDriver下載 最新版本 134.0.6998.35

平時為了下個驅動&#xff0c;到處找挺麻煩&#xff0c;收集了很多無償分享給需要的人&#xff0c;僅供學習和交流。 ChromeDriver及瀏覽器134.0.6998.35 ChromeDriver及瀏覽器133.0.6943.141 ChromeDriver 102.0.5005.61 ChromeDriver 105.0.5195.102 ChromeDriver 108.0…

QEMU源碼全解析 —— 塊設備虛擬化(2)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(1) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 特此致謝! 上一回講解了幾種虛擬化方式(全虛擬化、半虛擬化和硬件輔助虛擬化)的優缺點及其對比…

Redis——緩存穿透、擊穿、雪崩

緩存穿透 什么是緩存穿透 緩存穿透說簡單點就是大量請求的 key 根本不存在于緩存中&#xff0c;導致請求直接到了數據庫上&#xff0c;根本沒有經過緩存這一層。舉個例子&#xff1a;某個黑客故意制造我們緩存中不存在的 key 發起大量請求&#xff0c;導致大量請求落到數據庫…

DELETE/ UPDATE/ INSERT 語句會自動加鎖

在數據庫系統中&#xff0c;DELETE、UPDATE 和 INSERT 語句通常會自動加鎖&#xff0c;以確保數據的一致性和并發控制。具體的鎖類型和效果取決于數據庫的實現&#xff08;如 MySQL、PostgreSQL 等&#xff09;以及事務的隔離級別。以下是這些操作通常加鎖的行為和效果&#xf…

【從零開始學習計算機科學】硬件設計與FPGA原理

硬件設計 硬件設計流程 在設計硬件電路之前,首先要把大的框架和架構要搞清楚,這要求我們搞清楚要實現什么功能,然后找找有否能實現同樣或相似功能的參考電路板(要懂得盡量利用他人的成果,越是有經驗的工程師越會懂得借鑒他人的成果)。如果你找到了的參考設計,最好還是…

SpringCloud—概述—01

一、微服務 1&#xff09;單體架構 業務的所有功能實現都打包在一個 war 包或者 jar 包中&#xff0c;這種方式就稱為 單體架構 例如&#xff0c;學校中實現的博客系統&#xff0c;前端后端數據庫實現&#xff0c;都是在一個項目中 把所有模塊都寫在一個 web 項目中&#x…

C++ 學生成績管理系統

一、項目背景與核心需求 成績管理系統是高校教學管理的重要工具,本系統采用C++面向對象編程實現,主要功能模塊包括: 學生信息管理(學號/姓名/3門課程成績) 成績增刪改查(CRUD)操作 數據持久化存儲 統計分析與報表生成 用戶友好交互界面 二、系統架構設計 1. 類結構設計 …

go的grpc

GRPC介紹 目錄 單體架構微服務架構問題原始的grpc 服務端客戶端原生rpc的問題 grpc的hello world 服務端客戶端 proto文件proto語法 數據類型 基本數據類型其他數據類型 編寫風格多服務 單體架構 只能對整體擴容一榮俱榮&#xff0c;一損俱損代碼耦合&#xff0c;項目的開…