Java常見數據結構---八大結構

??前言:

數據結構是計算機底層存儲、組織數據的方式。是指數據相互之間是以什么方式排列在一起的。 通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率?

常見的八大數據結構:

?棧:

思想:

棧是一種數據結構,它遵循后進先出 (LIFO) 原則。這意味著最后添加的元素(稱為棧頂元素)將首先被移除。

特點:

  • **簡單性和效率:**棧的操作(push、pop、peek)可以在常數時間內完成。
  • **后進先出:**棧的 LIFO 特性使其非常適合需要按添加順序處理元素的應用。
  • 可以理解為子彈夾一樣,先進后出,后出先進

?

?數據進入棧模型的過程稱為:壓/進棧

??數據出棧模型的過程稱為:彈/出棧

代碼:?

public class Stack {private int[] arr;private int top;private int capacity;public Stack(int capacity) {this.arr = new int[capacity];this.top = -1;this.capacity = capacity;}public void push(int element) {if (isFull()) {System.out.println("Stack overflow");return;}arr[++top] = element;}public int pop() {if (isEmpty()) {System.out.println("Stack underflow");return -1;}return arr[top--];}public int peek() {if (isEmpty()) {System.out.println("Stack is empty");return -1;}return arr[top];}public boolean isEmpty() {return top == -1;}public boolean isFull() {return top == capacity - 1;}public static void main(String[] args) {Stack stack = new Stack(5);stack.push(1);stack.push(2);stack.push(3);stack.push(4);System.out.println("Top element: " + stack.peek());stack.pop();stack.pop();System.out.println("Top element: " + stack.peek());}
}

過程:

過程解釋:

  1. 創建棧:我們創建一個容量為 5 的棧對象。棧是用數組實現的,其中?top?變量跟蹤棧頂元素的索引。
  2. 壓入元素:push?方法將元素壓入棧中。如果棧已滿,它會打印一條錯誤消息。
  3. 彈出元素:pop?方法從棧中移除并返回棧頂元素。如果棧為空,它會打印一條錯誤消息。
  4. 查看棧頂元素:peek?方法返回棧頂元素,但不將其移除。如果棧為空,它會打印一條錯誤消息。
  5. 檢查棧是否為空:isEmpty?方法檢查棧是否為空。
  6. 檢查棧是否已滿:isFull?方法檢查棧是否已滿。
  7. 主方法:**在主方法中,我們創建了一個棧對象,壓入一些元素,彈出一些元素,并打印棧頂元素。

?最后輸出:

Top element: 4

Top element: 2

?

隊列:

思想:

隊列是一種遵循先進先出 (FIFO) 原則的數據結構。這意味著隊列中的第一個添加的元素將首先被移除。與棧恰恰相反,隊列兩端全開,遵循先進先出,后進后出的原則

特點:

  • 先進先出 (FIFO):隊列遵循先進先出原則,這意味著第一個添加的元素將首先被移除。
  • 線性數據結構:隊列是一種線性數據結構,這意味著元素按順序排列。
  • 插入在末尾:新元素總是添加到隊列的末尾(也稱為尾部)。
  • 刪除在頭部:元素從隊列的頭部(也稱為前端)移除。
  • 限制訪問:隊列只允許在頭部和尾部進行插入和刪除操作。中間元素無法直接訪問。
  • 隊列大小:隊列可以是固定大小的(使用數組實現)或動態大小的(使用鏈表實現)。
  • 廣泛的應用:隊列在計算機科學中有廣泛的應用,例如消息傳遞、任務調度、緩沖和廣度優先搜索

??

代碼:?

import java.util.LinkedList;
import java.util.Queue;public class QueueExample {public static void main(String[] args) {// 創建一個隊列Queue<Integer> queue = new LinkedList<>();// 向隊列中添加元素queue.add(1);queue.add(2);queue.add(3);queue.add(4);// 從隊列中移除元素int removedElement = queue.remove(); // 移除并返回第一個元素// 查看隊列中的第一個元素int headElement = queue.peek(); // 返回第一個元素,但不將其移除// 檢查隊列是否為空boolean isEmpty = queue.isEmpty();// 打印隊列中的元素System.out.println("Queue elements: " + queue);// 打印移除的元素System.out.println("Removed element: " + removedElement);// 打印隊列頭部的元素System.out.println("Head element: " + headElement);// 打印隊列是否為空System.out.println("Queue is empty: " + isEmpty);}
}

輸出:

Queue elements: [2, 3, 4]
Removed element: 1
Head element: 2
Queue is empty: false

過程:?

  1. 創建隊列:我們使用 Java 的?LinkedList?類創建一個隊列。LinkedList 實現了 Queue 接口,它提供了隊列的基本操作。
  2. 添加元素:add?方法將元素添加到隊列的末尾。
  3. 移除元素:remove?方法從隊列中移除并返回第一個元素。
  4. 查看隊列頭部的元素:peek?方法返回隊列中的第一個元素,但不將其移除。
  5. 檢查隊列是否為空:isEmpty?方法檢查隊列是否為空。

數組:

思想:

數組是一種數據結構,它存儲固定數量的相同類型元素的集合。數組中的元素使用索引進行訪問,索引從 0 開始。

數組相對其他數據結構相對來說比較簡單理解,可以理解為是一組元素,起始值下標從0開始

  1. 查詢速度快:查詢數據通過地址值和索引定位,查詢任意數據耗時相同。?
  2. 刪除效率低:要將原始數據刪除,同時后面每個數據前移。?

代碼:?

public class Array {public static void main(String[] args) {// 聲明一個長度為 7 的整型數組int[] arr = {1, 2, 3, 4, 5, 6, 7};// 遍歷數組并打印每個元素for (int element : arr) {System.out.println(element);}}
}

?過程:

  1. 聲明數組:我們聲明一個長度為 7 的整型數組,并使用花括號初始化其元素。
  2. 遍歷數組:使用增強 for 循環遍歷數組并打印每個元素。

鏈表:

思想:

鏈表是一種數據結構,它由一組稱為節點的對象組成。每個節點包含一個數據項和指向下一個節點的引用。

在 Java 中,鏈表使用以下類實現:

  • LinkedList:一個雙向鏈表,允許在列表的任何位置添加和刪除元素。
  • ArrayList:一個基于數組的列表,在列表末尾添加和刪除元素非常高?

鏈表中的元素是游離存儲的,每個元素節點包含數據值和下一個元素的地址。?

鏈表是一種增刪快、查詢慢的模型(對比數組)

?

?代碼:

public class LinkedList {public static void main(String[] args) {// 創建一個鏈表LinkedList<String> list = new LinkedList<>();// 向鏈表中添加元素list.add("Apple");list.add("Banana");list.add("Orange");// 遍歷鏈表并打印每個元素for (String fruit : list) {System.out.println(fruit);}// 從鏈表中刪除元素list.remove("Banana");// 打印修改后的鏈表System.out.println("Modified list:");for (String fruit : list) {System.out.println(fruit);}}
}

輸出:

Modified list:Apple??Orange

Banana元素已經被鏈表刪除

二叉樹:

思想:

二叉樹(Binary tree)是樹形結構的一個重要類型。許多實際問題抽象出來的數據結構往往是二叉樹形式,即使是一般的樹也能簡單地轉換為二叉樹,而且二叉樹的存儲結構及其算法都較為簡單,因此二叉樹顯得特別重要。二叉樹特點是每個節點最多只能有兩棵子樹,且有左右之分?[1]。

特點:

?只能有一個根節點,每個節點最多支持2個直接子節點。

節點的度: 節點擁有的子樹的個數,二叉樹的度不大于2 葉子節點 度為0的節點,也稱之為終端結點。

高度:葉子結點的高度為1,葉子結點的父節點高度為2,以此類推,根節點的高度最高。

層:根節點在第一層,以此類推

兄弟節點 :擁有共同父節點的節點互稱為兄弟節點

代碼:

?

public class BinaryTree {private Node root;public void add(int data) {root = addRecursive(root, data);}private Node addRecursive(Node current, int data) {if (current == null) {return new Node(data);}if (data < current.data) {current.left = addRecursive(current.left, data);} else if (data > current.data) {current.right = addRecursive(current.right, data);}return current;}public boolean contains(int data) {return containsRecursive(root, data);}private boolean containsRecursive(Node current, int data) {if (current == null) {return false;}if (data == current.data) {return true;} else if (data < current.data) {return containsRecursive(current.left, data);} else {return containsRecursive(current.right, data);}}public static void main(String[] args) {BinaryTree tree = new BinaryTree();tree.add(10);tree.add(5);tree.add(15);System.out.println("Contains 5: " + tree.contains(5));System.out.println("Contains 12: " + tree.contains(12));}
}class Node {int data;Node left;Node right;public Node(int data) {this.data = data;}
}

?過程:

  1. 添加元素:add()?方法使用遞歸將元素添加到二叉樹中。它將新元素與當前節點進行比較,并將其添加到左子樹或右子樹中,具體取決于元素的值。
  2. 查找元素:contains()?方法使用遞歸在二叉樹中查找元素。它將查找值與當前節點進行比較,并根據需要遞歸地遍歷左子樹或右子樹。
  3. 主方法:main()?方法創建二叉樹并向其中添加元素。然后,它調用?contains()?方法來查找樹中是否存在特定值。
  4. 輸出:Contains 5: true Contains 12: false

二叉查找樹:

思想:

二叉搜索樹又被稱為排序樹,它或者是一顆空樹,或者是一棵具有以下性質的二叉樹: 若它的左子樹不為空,則左子樹上所有節點的值都小于根節點的值 若它的右子樹不為空,則右子樹上所有節點的值都大于根節點的值

?特點:

1,每一個節點上最多有兩個子節點

2,左子樹上所有節點的值都小于根節點的值

3,右子樹上所有節點的值都大于根節點的值?

目的:提高檢索數據的性能。

不同點:

二叉樹

  • 每個節點最多有兩個子節點(左子節點和右子節點)。
  • 沒有排序規則。
  • 可以用于表示各種數據結構,例如堆和哈夫曼樹

二叉搜索樹(BST)

  • 一個特殊的二叉樹,其中每個節點的值都比其左子樹的所有值大,并且比其右子樹的所有值小。
  • 具有以下性質:
    • 左子樹中的所有值都小于根節點的值。
    • 右子樹中的所有值都大于根節點的值。
    • 左子樹和右子樹都是二叉搜索樹

區別

二叉搜索樹和二叉樹之間的主要區別在于排序規則

  • 二叉樹沒有排序規則,而二叉搜索樹中的節點根據其值進行排序

代碼:?

public class BinarySearchTree {private Node root;public void add(int data) {root = addRecursive(root, data);}private Node addRecursive(Node current, int data) {if (current == null) {return new Node(data);}if (data < current.data) {current.left = addRecursive(current.left, data);} else if (data > current.data) {current.right = addRecursive(current.right, data);}return current;}public boolean contains(int data) {return containsRecursive(root, data);}private boolean containsRecursive(Node current, int data) {if (current == null) {return false;}if (data == current.data) {return true;} else if (data < current.data) {return containsRecursive(current.left, data);} else {return containsRecursive(current.right, data);}}public static void main(String[] args) {BinarySearchTree tree = new BinarySearchTree();tree.add(10);tree.add(5);tree.add(15);System.out.println("Contains 5: " + tree.contains(5));System.out.println("Contains 12: " + tree.contains(12));}
}class Node {int data;Node left;Node right;public Node(int data) {this.data = data;}
}

?過程:

?

  1. 添加元素:add()?方法使用遞歸將元素添加到二叉查找樹中。它將新元素與當前節點進行比較,并將其添加到左子樹或右子樹中,具體取決于元素的值。
  2. 查找元素:contains()?方法使用遞歸在二叉查找樹中查找元素。它將查找值與當前節點進行比較,并根據需要遞歸地遍歷左子樹或右子樹。
  3. 主方法:main()?方法創建二叉查找樹并向其中添加元素。然后,它調用?contains()?方法來查找樹中是否存在特定值

輸出:

Contains 5: true
Contains 12: false

平衡二叉樹:

思想:

平衡二叉樹是一種特殊的二叉搜索樹,其中每個節點的左子樹和右子樹的高度差至多為 1。這確保了樹在很大程度上保持平衡,并且查找、插入和刪除操作的時間復雜度為 O(log n),其中 n 是樹中的節點數。

?平衡二叉樹可以通過使用稱為旋轉的操作來實現。旋轉是重新排列樹中節點以維護平衡的一種方法。AVL 樹和紅黑樹使用不同的旋轉規則來保持平衡。

平衡二叉樹是在滿足查找二叉樹的大小規則下,讓樹盡可能矮小,以此提高查數據的性能。??

代碼:?

public class AVLTree {private Node root;public void add(int data) {root = addRecursive(root, data);}private Node addRecursive(Node current, int data) {if (current == null) {return new Node(data);}if (data < current.data) {current.left = addRecursive(current.left, data);} else if (data > current.data) {current.right = addRecursive(current.right, data);}updateHeight(current);return balance(current);}private Node balance(Node current) {int balanceFactor = getBalanceFactor(current);if (balanceFactor > 1) {if (getBalanceFactor(current.left) < 0) {current.left = leftRotate(current.left);}return rightRotate(current);} else if (balanceFactor < -1) {if (getBalanceFactor(current.right) > 0) {current.right = rightRotate(current.right);}return leftRotate(current);}return current;}private int getBalanceFactor(Node node) {if (node == null) {return 0;}return height(node.left) - height(node.right);}private int height(Node node) {if (node == null) {return 0;}return node.height;}private void updateHeight(Node node) {node.height = 1 + Math.max(height(node.left), height(node.right));}private Node leftRotate(Node node) {Node newRoot = node.right;node.right = newRoot.left;newRoot.left = node;updateHeight(node);updateHeight(newRoot);return newRoot;}private Node rightRotate(Node node) {Node newRoot = node.left;node.left = newRoot.right;newRoot.right = node;updateHeight(node);updateHeight(newRoot);return newRoot;}public static void main(String[] args) {AVLTree tree = new AVLTree();tree.add(10);tree.add(5);tree.add(15);System.out.println("Inorder traversal of the AVL tree:");inorderTraversal(tree.root);}private static void inorderTraversal(Node node) {if (node != null) {inorderTraversal(node.left);System.out.print(node.data + " ");inorderTraversal(node.right);}}
}class Node {int data;Node left;Node right;int height;public Node(int data) {this.data = data;this.height = 1;}
}

過程:?

  1. 添加元素:add()?方法使用遞歸將元素添加到 AVL 樹中。它將新元素與當前節點進行比較,并將其添加到左子樹或右子樹中,具體取決于元素的值。添加后,它更新節點的高度并平衡樹以保持 AVL 性質。
  2. 平衡樹:balance()?方法檢查節點的平衡因子并執行必要的旋轉以平衡樹。
  3. 獲取平衡因子:getBalanceFactor()?方法計算節點的平衡因子,它等于左子樹的高度減去右子樹的高度。
  4. 獲取高度:height()?方法計算節點的高度,它等于其子樹中最大高度加 1。
  5. 更新高度:updateHeight()?方法更新節點的高度,它等于其子樹中最大高度加 1。
  6. 左旋轉:leftRotate()?方法執行左旋轉操作,它將當前節點的右子樹作為新根,并將當前節點作為新根的左子樹。
  7. 右旋轉:rightRotate()?方法執行右旋轉操作,它將當前節點的左子樹作為新根,并將當前節點作為新根的右子樹。
  8. 主方法:main()?方法創建 AVL 樹并向其中添加元素。然后,它打印樹的中序遍歷以顯示樹的順序。

結果:?

Inorder traversal of the AVL tree:
5 10 15
?

紅黑樹:

規則:?

?每一個節點或是紅色的,或者是黑色的,根節點必須是黑色。

如果某一個節點是紅色,那么它的子節點必須是黑色(不能出現兩個紅色節點相連的情況)。

對每一個節點,從該節點到其所有后代葉節點的簡單路徑上,均包含相同數目的黑色節點。

?

當添加的節點為根節點時,直接變成黑色就可以了?

?

?代碼:

import java.util.ArrayList;
import java.util.List;public class RedBlackTree {private Node root;public void add(int data) {root = addRecursive(root, data);root.color = Color.BLACK;}private Node addRecursive(Node current, int data) {if (current == null) {return new Node(data);}if (data < current.data) {current.left = addRecursive(current.left, data);} else if (data > current.data) {current.right = addRecursive(current.right, data);}if (isRed(current.left) && isRed(current.right)) {flipColors(current);}if (isRed(current.left) && isRed(current.left.left)) {current = rightRotate(current);}if (isRed(current.right) && isRed(current.right.right)) {current = leftRotate(current);}return current;}private void flipColors(Node node) {node.color = Color.RED;node.left.color = Color.BLACK;node.right.color = Color.BLACK;}private Node rightRotate(Node node) {Node newRoot = node.left;node.left = newRoot.right;newRoot.right = node;newRoot.color = node.color;node.color = Color.RED;return newRoot;}private Node leftRotate(Node node) {Node newRoot = node.right;node.right = newRoot.left;newRoot.left = node;newRoot.color = node.color;node.color = Color.RED;return newRoot;}private boolean isRed(Node node) {return node != null && node.color == Color.RED;}public static void main(String[] args) {RedBlackTree tree = new RedBlackTree();int[] data = {20, 18, 23, 20, 16, 24, 19};for (int value : data) {tree.add(value);}List<Node> redNodes = new ArrayList<>();inorderTraversal(tree.root, redNodes);System.out.println("Red nodes in the Red-Black tree:");for (Node node : redNodes) {System.out.print(node.data + " ");}}private static void inorderTraversal(Node node, List<Node> redNodes) {if (node != null) {inorderTraversal(node.left, redNodes);if (node.color == Color.RED) {redNodes.add(node);}inorderTraversal(node.right, redNodes);}}private enum Color {RED,BLACK}private static class Node {int data;Node left;Node right;Color color;public Node(int data) {this.data = data;this.color = Color.RED;}}
}

步驟:

? ? ? ? ? ?20(B)
? ? ? ? ? ? ?/ ?\
? ? ? ? ? ?18(R) 23(R)
? ? ? ? ? / ? / ?\
? ? ? ? 16(B) 20(R) 24(B)
? ? ? ? ? ? ? ?/
? ? ? ? ? ? ?19(R)

紅色節點R表示,黑節點B表示

?總結:

紅黑樹不是高度平衡的,它的平衡是通過"紅黑規則"進行實現的?

每一個節點或是紅色的,或者是黑色的,根節點必須是黑色

如果一個節點沒有子節點或者父節點,則該節點相應的指針屬性值為Nil,這些Nil視為葉節點,每個葉節點(Nil)是黑色的;

如果某一個節點是紅色,那么它的子節點必須是黑色(不能出現兩個紅色節點相連的情況) 對每一個節點,從該節點到其所有后代葉節點的簡單路徑上,均包含相同數目的黑色節點。?

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

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

相關文章

大數據項目中的拉鏈表(hadoop,hive)

緩慢漸變維 拉鏈表 拉鏈表&#xff0c;可實現數據快照&#xff0c;可以將歷史和最新數據保存在一起 如何實現: 在原始數據增加兩個新字段 起始時間&#xff08;有效時間&#xff1a;什么時候導入的數據的時間&#xff09;&#xff0c;結束時間&#xff08;默認的結束時間為99…

運籌系列92:vrp算法包VROOM

1. 介紹 VROOM is an open-source optimization engine written in C20 that aim at providing good solutions to various real-life vehicle routing problems (VRP) within a small computing time. 可以解決如下問題&#xff1a; TSP (travelling salesman problem) CVRP …

九、 個人信息出境標準合同的簽署及備案流程是怎樣的?

為指導和幫助個人信息處理者規范有序備案個人信息出境標準合同&#xff0c;國家網信辦結合此前備案實踐經驗發布了《標準合同備案指南&#xff08;第二版&#xff09;》&#xff0c;并就個人信息出境標準合同備案的適用范圍、備案方式、備案流程和材料以及咨詢、舉報聯系方式等…

F5 BIG-IP Next Central Manager SQL注入漏洞(CVE-2024-26026、CVE-2024-21793)

0x01 產品簡介 BIG-IP Next Central Manager是BIG-IP Next的原生默認用戶界面,它可跨平臺管理BIG-IP Next實例。BIG-IP Next是F5 Networks公司推出的一款下一代BIG-IP軟件,提供了多云應用安全和應用交付服務。 0x02 漏洞概述 CVE-2024-26026:BIG-IP Next Central Manager…

產品推薦 | 基于AMD Virtex 7 FPGA VC709 的高速連接功能開發板

01 產品概述 Virtex? 7 FPGA VC709 連接功能套件是一款速率為 40Gb/s 的高速平臺&#xff0c;您可以通過評估和開發連接功能&#xff0c;迅速為包含所有必要軟硬件和 IP 核的高帶寬和高性能應用提供強大的支持。它包括一個含有 PCI Express Gen 3、Northwest Logic 公司推出的…

4.1 文本相似度(二)

目錄 1 文本相似度評估 2 代碼 2.1 load_dataset 方法 2.2 AutoTokenizer、AutoModelForSequenceClassification 1 文本相似度評估 對兩個文本拼接起來&#xff0c;然后作為一個樣本喂給模型&#xff0c;作為一個二分類的任務&#xff1b; 數據處理的方式以及訓練的基本流程…

c 指針基礎

/* 指針練習*/ #include <stdio.h> #include <stdlib.h> void printAll(int n1, int n2, int *p1, int *p2); int main(){ //賦值操作語法演示 int num1 1111; int num2 2222; int *prt1 &num1; int *prt2 &num2; printAll(num1, num2, prt1…

maven .lastUpdated文件作用

現象 有時候我在用maven管理項目時會發現有些依賴報錯&#xff0c;這時你可以看一下本地倉庫中是否有.lastUpdated文件&#xff0c;也許與它有關。 原因 有這個文件就表示依賴下載過程中發生了錯誤導致依賴沒成功下載&#xff0c;可能是網絡原因&#xff0c;也有可能是遠程…

平面設計基礎指南:從零開始的學習之旅!

平面設計師主要做什么&#xff1f; 平面設計師通過創建視覺概念來傳達信息。他們創造了從海報和廣告牌到包裝、標志和營銷材料的所有內容&#xff0c;并通過使用形狀、顏色、排版、圖像和其他元素向觀眾傳達了他們的想法。平面設計師可以在內部工作&#xff0c;專門為品牌創建…

Mac安裝jadx

1、使用命令brew安裝 : brew install jadx 輸入完命令,等待安裝完畢 備注&#xff08;關于Homebrew &#xff09;&#xff1a; Homebrew 是 MacOS 下的包管理工具&#xff0c;類似 apt-get/apt 之于 Linux&#xff0c;yum 之于 CentOS。如果一款軟件發布時支持了 homebrew 安…

mac定時任務、自啟動任務

https://quail.ink/mynotes/p/mac-startup-configuration-detailed-explanation <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.d…

【2024年5月備考新增】】 考前篇(2)《官方平臺 - 考生模擬練習平臺常用操作(一)》

軟考考生常用操作說明 說明:模擬作答系統是旨在讓考生熟悉計算機化考試環境和作答方式,模擬作答不保存考生作答 歷史記錄。考試題型、題量、分值、界面及文字內容以正式考試答題系統為準。 1 如何標記試題、切換試題 2 簡答題如何查看歷史記錄、切換輸入法 3 選做題,已作答…

游戲找不到steam_api64.dll如何解決,介紹5種簡單有效的方法

面對“找不到steam_api64.dll&#xff0c;無法繼續執行代碼”的問題&#xff0c;許多游戲玩家或軟件使用者可能會感到手足無措。這個錯誤提示意味著你的計算機系統在嘗試運行某個游戲或應用程序時&#xff0c;無法定位到一個至關重要的動態鏈接庫文件——steam_api64.dll&#…

《深入Linux內核架構》第3章 內存管理(6)

目錄 3.5.7 內核中不連續頁的分配 3.5.8 內核映射 本專欄文章將有70篇左右&#xff0c;歡迎關注&#xff0c;訂閱后續文章。 本節講解vmalloc, vmap&#xff0c;kmap原理。 3.5.7 內核中不連續頁的分配 kmalloc函數&#xff1a;分配物理地址和虛擬地址都連續的內存。 kmall…

MongoDB聚合運算符:$type

MongoDB聚合運算符&#xff1a;$type 文章目錄 MongoDB聚合運算符&#xff1a;$type語法使用可用的類型 舉例 $type聚合運算符用來返回指定參數的BSON類型的字符串。。 語法 { $type: <expression> }<expression>可以是任何合法的表達式。 使用 不像查詢操作符$…

Selenium + Pytest自動化測試框架實戰(上)

前言 今天呢筆者想和大家來聊聊selenium自動化 pytest測試框架&#xff0c;在這篇文章里你需要知道一定的python基礎——至少明白類與對象&#xff0c;封裝繼承&#xff1b;一定的selenium基礎。這篇文章不會selenium&#xff0c;不會的可以自己去看selenium中文翻譯網喲。 一…

六西格瑪管理培訓公司:事業進階的充電站,助你沖破職場天花板!

六西格瑪&#xff0c;源于制造業&#xff0c;卻不僅僅局限于制造業。它是一種以數據為基礎、以顧客為中心、以流程優化為手段的全面質量管理方法。通過六西格瑪管理&#xff0c;企業可以系統性地識別并解決運營過程中的問題&#xff0c;提高產品和服務的質量&#xff0c;降低成…

導航app為什么知道還有幾秒變綠燈?

在使用地圖導航app行駛至信號燈的交叉路口時&#xff0c;這些應用程序會貼心地告知用戶距信號燈變化還有多少秒&#xff0c;無論是即將轉為綠燈還是紅燈。這一智能化提示不僅使得駕駛員能適時做好起步或剎車的準備&#xff0c;有效緩解了因等待時間不確定而產生的焦慮情緒&…

GBPC2510-ASEMI工業電源專用GBPC2510

編輯&#xff1a;ll GBPC2510-ASEMI工業電源專用GBPC2510 型號&#xff1a;GBPC2510 品牌&#xff1a;ASEMI 封裝&#xff1a;GBPC-4 最大重復峰值反向電壓&#xff1a;1000V 最大正向平均整流電流(Vdss)&#xff1a;25A 功率(Pd)&#xff1a;中小功率 芯片個數&#x…

分布式鎖之RedissonLock

什么是Redisson&#xff1f; 俗話說他就是看門狗&#xff0c;看門狗機制是一種用于保持Redis連接活躍性的方法&#xff0c;通常用于分布式鎖的場景。看門狗的工作原理是&#xff1a;當客戶端獲取到鎖之后&#xff0c;會對Redis中的一個特定的鍵設置一個有限的過期時間&#xff…