【C# 數據結構】隊列 FIFO

目錄

  • 隊列的概念
  • FIFO (First-In, First-Out)
      • `Queue<T>` 的工作原理:
      • 示例:
        • 解釋:
      • 小結:
  • 環形隊列
      • 1. **FIFO?**
      • 2. **環形緩沖隊列如何實現FIFO?**
        • 關鍵概念:
      • 3. **環形緩沖隊列的工作過程**
        • 假設:
        • 操作步驟:
      • 4. **具體例子**
        • 初始狀態:
        • 操作1:入隊數據 `A`
        • 操作2:入隊數據 `B`
        • 操作3:出隊
        • 操作4:入隊數據 `C`, `D`, `E`
        • 操作5:出隊
        • 操作6:入隊數據 `F`
        • 操作7:出隊
      • 5. **環形緩沖隊列的FIFO特性**
      • 6. **環形緩沖隊列的FIFO優勢**
      • 7. **小結**
  • C# 如何通過代碼實現環狀隊列?
      • 1. **使用 `Queue<T>` 實現環形緩沖隊列**
      • 使用示例:
      • 說明:
      • 2. **使用固定大小數組實現環形緩沖隊列**
      • 使用示例:
      • 說明:
      • 小結
  • 隊列和環狀隊列的對比
      • 1. **環形緩沖隊列是FIFO的一種實現**
      • 2. **環形緩沖隊列的特點**
      • 3. **環形緩沖隊列 vs 其他FIFO實現**
      • 4. **環形緩沖隊列的局限性**
      • 5. **小結**
  • 線程安全問題
      • Queue<T> 如果一個線程只負責寫,一個線程只負責讀會有問題嗎?
      • 問題原因:
      • 一些潛在的風險:
      • 如何解決?
        • 1. 使用鎖 (`lock`)
        • 2. 使用 `ConcurrentQueue<T>`
      • 總結:

隊列的概念

隊列和FIFO是什么關系?隊列是一種數據結構。
FIFO是隊列需要遵循的基本原則:First-In, First-Out。或者說FIFO是隊列的基本特性!
C#中有個類叫做Queue,就是實現了隊列這種數據結構的類,它遵循FIFO這個原則。

FIFO (First-In, First-Out)

FIFO(First In First Out,先進先出)是一種數據管理原則,就像排隊一樣:

  • 先進入隊列的數據先被處理
  • 后進入隊列的數據后被處理

在 FIFO 隊列中,第一個進入隊列的元素將是第一個被移除的元素。換句話說,隊列中的元素按照它們被加入的順序排列,最早加入的元素最先被取出。

Queue<T> 的工作原理:

  • 入隊 (Enqueue):新元素被添加到隊列的尾部。
  • 出隊 (Dequeue):最早加入隊列的元素從隊列的頭部移除,并返回該元素。

示例:

假設我們使用一個容量為 3 的隊列,依次加入元素 123,然后進行 Dequeue() 操作:

Queue<int> queue = new Queue<int>();// 入隊操作
queue.Enqueue(1);
queue.Enqueue(2);
queue.Enqueue(3);// 出隊操作,按照 FIFO 順序返回
Console.WriteLine(queue.Dequeue()); // 輸出 1
Console.WriteLine(queue.Dequeue()); // 輸出 2
Console.WriteLine(queue.Dequeue()); // 輸出 3
解釋:
  • Enqueue(1)1 加入隊列的尾部。
  • Enqueue(2)2 加入隊列的尾部。
  • Enqueue(3)3 加入隊列的尾部。
  • Dequeue() 返回并移除隊列的頭部元素,即最早加入的 1,然后是 23,遵循 FIFO 的順序。

小結:

通過Queue<T> 的使用我們可以很好的理解 FIFO ,其中元素按照加入的順序進行排隊,最早加入的元素最先被取出。這使得它特別適用于處理排隊和任務調度等場景。

環形隊列


1. FIFO?

環狀隊列也是隊列的一種,當然也遵循FIFO這個原則!

2. 環形緩沖隊列如何實現FIFO?

環形緩沖隊列是一種用固定大小的數組實現FIFO的方式。它通過兩個指針(頭指針和尾指針)來管理數據的入隊和出隊。

關鍵概念:
  • 固定大小的數組:預分配一塊連續的內存空間。
  • 頭指針(head):指向下一個數據寫入的位置。
  • 尾指針(tail):指向下一個數據讀取的位置。
  • 循環利用:當指針到達數組末尾時,會回到數組開頭,形成一個“環”。

3. 環形緩沖隊列的工作過程

讓我們通過一個具體的例子來說明。

假設:
  • 環形緩沖隊列的容量為 5(即數組大小為5)。
  • 初始狀態:隊列為空,headtail 都指向位置 0
操作步驟:
  1. 入隊(Enqueue)

    • 將數據寫入 head 指向的位置。
    • 然后 head 向前移動一位。
    • 如果 head 到達數組末尾,它會回到數組開頭(循環特性)。
  2. 出隊(Dequeue)

    • tail 指向的位置讀取數據。
    • 然后 tail 向前移動一位。
    • 如果 tail 到達數組末尾,它會回到數組開頭。

4. 具體例子

初始狀態:
數組索引: [0]  [1]  [2]  [3]  [4]
值:      None None None None None
head = 0, tail = 0
操作1:入隊數據 A
  • A 寫入 head 指向的位置(索引 0)。
  • head 移動到下一個位置(索引 1)。
數組索引: [0]  [1]  [2]  [3]  [4]
值:       A    None None None None
head = 1, tail = 0
操作2:入隊數據 B
  • B 寫入 head 指向的位置(索引 1)。
  • head 移動到下一個位置(索引 2)。
數組索引: [0]  [1]  [2]  [3]  [4]
值:       A     B    None None None
head = 2, tail = 0
操作3:出隊
  • tail 指向的位置(索引 0)讀取數據 A
  • tail 移動到下一個位置(索引 1)。
數組索引: [0]  [1]  [2]  [3]  [4]
值:       A     B    None None None
head = 2, tail = 1
操作4:入隊數據 C, D, E
  • 依次將 C, D, E 寫入 head 指向的位置。
  • head 移動到下一個位置。
數組索引: [0]  [1]  [2]  [3]  [4]
值:       A     B     C     D     E
head = 0, tail = 1
操作5:出隊
  • tail 指向的位置(索引 1)讀取數據 B
  • tail 移動到下一個位置(索引 2)。
數組索引: [0]  [1]  [2]  [3]  [4]
值:       A     B     C     D     E
head = 0, tail = 2
操作6:入隊數據 F
  • F 寫入 head 指向的位置(索引 0)。
  • head 移動到下一個位置(索引 1)。
數組索引: [0]  [1]  [2]  [3]  [4]
值:       F     B     C     D     E
head = 1, tail = 2
操作7:出隊
  • tail 指向的位置(索引 2)讀取數據 C
  • tail 移動到下一個位置(索引 3)。
數組索引: [0]  [1]  [2]  [3]  [4]
值:       F     B     C     D     E
head = 1, tail = 3

5. 環形緩沖隊列的FIFO特性

  • 數據順序:先入隊的數據(如 A, B)先出隊,后入隊的數據(如 C, D, E)后出隊。
  • 循環利用:當 headtail 到達數組末尾時,會回到數組開頭,繼續使用之前釋放的空間。
  • 固定容量:隊列的大小是固定的,當隊列滿時,可以選擇覆蓋舊數據或報錯。

6. 環形緩沖隊列的FIFO優勢

  • 高效:入隊和出隊操作的時間復雜度都是 O(1)。
  • 內存緊湊:數據連續存儲,緩存友好。
  • 適合實時系統:適合處理固定大小的數據流。

7. 小結

  • 環形緩沖隊列是FIFO的一種實現,它通過固定大小的數組和循環指針來實現先進先出的特性。
  • 數據按順序入隊和出隊,先進入隊列的數據先被處理。
  • 循環利用使得內存使用更高效,適合處理固定大小的數據流。
    通過理解環狀隊列你是不是對隊列又有了更深的理解呢? 😊

C# 如何通過代碼實現環狀隊列?

之前說到,C# 中有個現成的類實現了隊列就是Queue這個類。但是并沒有現成的環狀隊列。

要手動實現環形緩沖隊列(Circular Buffer)在 C# 中,可以通過結合 Queue<T> 或者直接使用一個固定大小的數組來模擬環形隊列的行為。下面是兩種常見的實現方式。

1. 使用 Queue<T> 實現環形緩沖隊列

雖然 Queue<T> 本身并不是環形隊列,但我們可以通過管理隊列的最大容量和覆蓋舊數據來模擬環形緩沖隊列的行為。當隊列滿時,新的數據會覆蓋最舊的數據。

public class CircularQueue<T>
{private readonly Queue<T> queue;private readonly int capacity;public CircularQueue(int capacity){this.capacity = capacity;this.queue = new Queue<T>(capacity);}// 添加元素,如果隊列已滿,則移除最舊的元素public void Enqueue(T item){if (queue.Count == capacity){queue.Dequeue(); // 移除最舊的元素}queue.Enqueue(item);}// 從隊列中取出元素public T Dequeue(){if (queue.Count == 0){throw new InvalidOperationException("Queue is empty.");}return queue.Dequeue();}// 查看隊列中的第一個元素public T Peek(){if (queue.Count == 0){throw new InvalidOperationException("Queue is empty.");}return queue.Peek();}// 判斷隊列是否為空public bool IsEmpty() => queue.Count == 0;// 隊列中的元素個數public int Count => queue.Count;
}

使用示例:

CircularQueue<int> circularQueue = new CircularQueue<int>(3);circularQueue.Enqueue(1);
circularQueue.Enqueue(2);
circularQueue.Enqueue(3);Console.WriteLine(circularQueue.Dequeue()); // 輸出 1
circularQueue.Enqueue(4); // 現在隊列已滿,1 會被覆蓋Console.WriteLine(circularQueue.Dequeue()); // 輸出 2
Console.WriteLine(circularQueue.Dequeue()); // 輸出 3
Console.WriteLine(circularQueue.Dequeue()); // 輸出 4

說明:

  • Queue<T> 用于存儲數據,最大容量為 capacity
  • 當隊列滿時(元素數量等于 capacity),通過 Dequeue() 移除最舊的元素,再插入新的元素,模擬環形緩沖的行為。

這種方式依賴于 Queue<T> 來管理隊列的基本操作,簡單易懂,但不能完全利用環形緩沖隊列的內存高效性,尤其是在每次擴展隊列容量時仍會引起內存分配。


2. 使用固定大小數組實現環形緩沖隊列

這種方法通過手動管理隊列的頭尾指針和數組來實現環形緩沖區,避免了 Queue<T> 的擴展和額外的內存分配。下面是一個更低層次的實現方式:

public class CircularBuffer<T>
{private readonly T[] buffer;private int head;private int tail;private int size;private readonly int capacity;public CircularBuffer(int capacity){this.capacity = capacity;this.buffer = new T[capacity];this.head = 0;this.tail = 0;this.size = 0;}// 添加元素到隊列public void Enqueue(T item){if (size == capacity){// 隊列已滿,覆蓋最舊的數據head = (head + 1) % capacity; // 更新頭指針}else{size++;}buffer[tail] = item;tail = (tail + 1) % capacity; // 更新尾指針}// 從隊列中取出元素public T Dequeue(){if (size == 0){throw new InvalidOperationException("Queue is empty.");}T value = buffer[head];head = (head + 1) % capacity; // 更新頭指針size--;return value;}// 查看隊列的第一個元素public T Peek(){if (size == 0){throw new InvalidOperationException("Queue is empty.");}return buffer[head];}// 判斷隊列是否為空public bool IsEmpty() => size == 0;// 隊列中的元素個數public int Count => size;
}

使用示例:

CircularBuffer<int> buffer = new CircularBuffer<int>(3);buffer.Enqueue(1);
buffer.Enqueue(2);
buffer.Enqueue(3);Console.WriteLine(buffer.Dequeue()); // 輸出 1
buffer.Enqueue(4); // 1 被覆蓋Console.WriteLine(buffer.Dequeue()); // 輸出 2
Console.WriteLine(buffer.Dequeue()); // 輸出 3
Console.WriteLine(buffer.Dequeue()); // 輸出 4

說明:

  • 通過一個固定大小的數組 buffer 存儲數據,隊列大小為 capacity
  • headtail 指針管理數據的入隊和出隊。head 指針指向隊列的頭部(最舊的元素),tail 指針指向隊列的尾部(最新的元素)。
  • 當隊列滿時,新元素會覆蓋最舊的數據,head 指針會移動到下一個位置,從而實現環形緩沖隊列的覆蓋行為。

這種方式比 Queue<T> 更高效,避免了額外的內存分配,適合需要頻繁進行入隊和出隊操作的場景。


小結

  • 使用 Queue<T>:可以通過在隊列滿時刪除最舊元素來模擬環形緩沖隊列,適用于簡單的場景。
  • 使用固定大小數組:手動管理頭尾指針和隊列大小,更高效,避免內存分配,適用于性能要求較高的場景。

隊列和環狀隊列的對比


1. 環形緩沖隊列是FIFO的一種實現

  • FIFO原則:數據按照到達順序處理,先進入隊列的數據先被取出。
  • 環形緩沖隊列:通過固定大小的數組和循環指針實現FIFO,滿足先進先出的特性。

2. 環形緩沖隊列的特點

  • 固定大小:預分配固定容量的內存,空間利用率高。
  • 循環利用:通過頭尾指針循環移動,重復利用數組空間。
  • 高效性能:插入和刪除操作的時間復雜度都是O(1)。
  • 內存緊湊:數據連續存儲,緩存友好。

3. 環形緩沖隊列 vs 其他FIFO實現

特性環形緩沖隊列鏈表實現的FIFO動態數組實現的FIFO
內存分配一次性預分配動態分配節點動態擴容
空間利用率100%較低(每個節點有額外開銷)較高(但有擴容開銷)
插入/刪除性能O(1)O(1)均攤O(1),擴容時O(n)
隨機訪問不支持不支持支持
適用場景固定大小數據流、實時系統數據量變化大、簡單實現需要隨機訪問的場景

4. 環形緩沖隊列的局限性

  • 固定大小:需要預先確定容量,不適合數據量變化大的場景。
  • 不支持隨機訪問:只能按順序訪問數據。
  • 溢出處理:隊列滿時需要明確策略(覆蓋舊數據或報錯)。

5. 小結

  • 環形緩沖隊列是FIFO的一種高效實現,特別適合固定大小、高吞吐量的場景。
  • 它通過循環利用預分配的內存,避免了動態內存分配的開銷,同時保持了FIFO的特性。
  • 如果需要動態擴容或更靈活的內存管理,可以選擇其他FIFO實現(如鏈表或動態數組)。

線程安全問題


1 多線程訪問隊列的潛在問題
1.1 競態條件(Race Condition)
問題描述:多個線程同時修改隊列的狀態(如 head 和 tail 指針),導致數據不一致。

示例:
線程A和線程B同時執行入隊操作。
兩者讀取相同的 head 指針值,導致數據覆蓋或丟失。

1.2 數據不一致
問題描述:一個線程正在修改隊列,另一個線程同時讀取隊列,導致讀取到不完整或錯誤的數據。

示例:

線程A正在入隊,更新了 head 指針但還未寫入數據。

線程B讀取 head 指針,誤認為新數據已寫入。

1.3 死鎖(Deadlock)
問題描述:多個線程互相等待對方釋放鎖,導致程序無法繼續執行。

示例:

線程A持有鎖1并等待鎖2。

線程B持有鎖2并等待鎖1。

Queue 如果一個線程只負責寫,一個線程只負責讀會有問題嗎?

如果一個線程 只負責寫Enqueue)而另一個線程 只負責讀Dequeue),在 不使用鎖 或其他線程同步機制的情況下,Queue<T> 仍然 可能會遇到問題,即使你不打算在同一時間內進行讀寫操作。

問題原因:

  • 隊列的內部狀態Queue<T> 并沒有內建的線程安全機制來保證即使在讀寫操作不重疊的情況下,兩個線程對隊列的訪問是安全的。
    • 例如,讀線程可能會在 寫線程 操作隊列時,導致內部數據不一致或訪問沖突。即使一個線程只負責寫,另一個線程只負責讀,也可能會出現 競態條件(race condition)或 內存可見性問題

一些潛在的風險:

  1. 隊列大小(Count)的讀取:如果 Queue<T> 正在被修改(例如,寫線程在 Enqueue),另一個線程試圖讀取隊列大小或進行 Dequeue 操作,可能會得到不一致的結果。因為寫線程可能在修改隊列時,讀線程同時查看到一個不完全或不一致的隊列狀態。

  2. 數據一致性:盡管讀寫操作看似是順序執行的,實際上在多個線程訪問共享數據時,現代 CPU 和優化可能導致線程看到過時或不一致的數據(內存可見性問題)。因此,即使操作本身是序列化的,底層的硬件優化仍可能引發問題。

如何解決?

1. 使用鎖 (lock)

通過使用 lock 確保 寫操作讀操作 不會同時進行,這樣可以防止數據競爭和不一致性:

public class ThreadSafeQueue<T>
{private readonly Queue<T> queue = new Queue<T>();private readonly object lockObject = new object();public void Enqueue(T item){lock (lockObject){queue.Enqueue(item);}}public T Dequeue(){lock (lockObject){if (queue.Count == 0)throw new InvalidOperationException("Queue is empty.");return queue.Dequeue();}}public int Count{get{lock (lockObject){return queue.Count;}}}
}

在這個示例中,通過 lock 來確保寫操作和讀操作不會發生競態條件。

2. 使用 ConcurrentQueue<T>

如果你不希望手動加鎖,可以使用 ConcurrentQueue<T>,它是線程安全的,可以在多個線程中同時進行讀寫操作,保證數據的一致性和正確性:

using System.Collections.Concurrent;var concurrentQueue = new ConcurrentQueue<int>();// 寫線程:入隊
concurrentQueue.Enqueue(1);
concurrentQueue.Enqueue(2);// 讀線程:出隊
if (concurrentQueue.TryDequeue(out int result))
{Console.WriteLine(result); // 安全地獲取隊列元素
}

ConcurrentQueue<T> 會自動管理線程同步,因此你不需要擔心加鎖的問題,它會確保多線程環境下的正確性。

總結:

  • 即使一個線程只負責寫,另一個線程只負責讀,Queue<T> 仍然 不保證線程安全,會有潛在的競態條件和數據不一致問題。
  • 如果需要確保線程安全,可以使用 lock 來同步讀寫操作,或者使用 ConcurrentQueue<T> 來避免手動管理同步。推薦使用 ConcurrentQueue<T>,因為它是專為多線程設計并且已經實現了高效的線程安全。

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

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

相關文章

Mac 清理緩存,提高內存空間

步驟 1.打開【訪達】 2.菜單欄第五個功能【前往】&#xff0c;點擊【個人】 3.【command shift J】顯示所有文件&#xff0c;打開【資源庫】 4.刪除【Containers】和【Caches】文件 Containers 文件夾&#xff1a;用于存儲每個應用程序的沙盒數據&#xff0c;確保應用程序…

Hutool - DFA:基于 DFA 模型的多關鍵字查找

一、簡介 在文本處理中&#xff0c;常常需要在一段文本里查找多個關鍵字是否存在&#xff0c;例如敏感詞過濾、關鍵詞匹配等場景。Hutool - DFA 模塊基于確定性有限自動機&#xff08;Deterministic Finite Automaton&#xff0c;DFA&#xff09;模型&#xff0c;為我們提供了…

C++STL容器之map

1.介紹 map是 C 標準模板庫&#xff08;STL&#xff09;中的一個關聯容器&#xff0c;用于存儲鍵值對&#xff08;key-value pairs&#xff09;。map中的元素是按照鍵&#xff08;key&#xff09;進行排序的&#xff0c;并且每個鍵在容器中是唯一的。map通常基于紅黑樹&#xf…

CentOS的ssh復制文件

1.前提 首先要已經連接上了對方的ssh 2.命令 scp [文件] 目標IP:目標路徑 例如&#xff1a; $PWD是一個環境變量&#xff0c;可以獲取當前絕對目錄&#xff0c;ssh上傳的時候一定要確保對方有這個目錄才行&#xff0c;不然會報錯 3.遞歸上傳 scp -r 目錄 目標IP:路徑 可以…

《Python實戰進階》專欄 No.3:Django 項目結構解析與入門DEMO

《Python實戰進階》專欄 第3集&#xff1a;Django 項目結構解析與入門DEMO 在本集中&#xff0c;我們將深入探討 Django 的項目結構&#xff0c;并實際配置并運行一個入門DEMO博客網站&#xff0c;幫助你在 Web 開發中更高效地使用 Django。Django 是一個功能強大的 Python Web…

每日一題——376. 擺動序列

題目鏈接&#xff1a;376. 擺動序列 - 力扣&#xff08;LeetCode&#xff09; 代碼&#xff1a; class Solution { public:int wiggleMaxLength(vector<int>& nums) {int curdiff 0;int prediff 0;int result 1; for(int i 0;i < nums.size()-1;i){curdiff …

DeepSeek與ChatGPT:AI語言模型的全面技術解析與對比

DeepSeek與ChatGPT:AI語言模型的全面技術解析與對比 一、誕生背景與技術演進路徑 1.1 OpenAI與ChatGPT的生態布局 ChatGPT的研發主體OpenAI成立于2015年,早期定位為非營利性研究機構,核心目標為實現通用人工智能(AGI)。其技術路徑以Transformer架構為基礎,通過堆疊參數規…

[原創](Modern C++)現代C++的關鍵性概念: 學習新算法: std::unique_copy

[作者] 常用網名: 豬頭三 出生日期: 1981.XX.XX 企鵝交流: 643439947 個人網站: 80x86匯編小站 編程生涯: 2001年~至今[共24年] 職業生涯: 22年 開發語言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 開發工具: Visual Studio、Delphi、XCode、Eclipse…

前端(vue)學習筆記(CLASS 1):vue框架入門

1、vue上手 概念&#xff1a;vue是一個用于構建用戶界面的漸進式框架 vue的兩種使用方式&#xff1a; 1、vue的核心包開發 場景&#xff1a;局部模塊改造 2、vue核心包&vue插件工程化開發 場景&#xff1a;整站開發 1、創建實例 核心步驟 1、準備容器&#xff08;…

synchronized鎖字符串

示例一 在沒有使用synchronized鎖的情況下: import java.util.HashMap; import java.util.Map;public class NonSynchronizedSchoolExample {private static final Map<String, Integer> schoolCountMap new HashMap<>(); // 存儲每個學校的交卷數量public sta…

1.14作業

1 if($x[scheme]http||$x[scheme]https){ $ip gethostbyname($x[host]); echo </br>.$ip.</br>; if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {die(ip!); }echo file_get_contents($_POST[url]);可以DNS重…

Hopper架構 GEMM教程

一 使用 1.1 makefile compile:nvcc -arch=sm_90a -lcuda -lcublas -std=c++17 matmul_h100_optimal.cu -o testrun:./test加入-lcublas,不然會有函數無法被識別 二 代碼分析 2.1 kernel外參數分析 2.1.1 基本參數 constexpr int BM = 64*2;constexpr int BN = 256;cons…

DeepSeek模型快速部署教程-搭建自己的DeepSeek

前言&#xff1a;在人工智能技術飛速發展的今天&#xff0c;深度學習模型已成為推動各行各業智能化轉型的核心驅動力。DeepSeek 作為一款領先的 AI 模型&#xff0c;憑借其高效的性能和靈活的部署方式&#xff0c;受到了廣泛關注。無論是自然語言處理、圖像識別&#xff0c;還是…

數據倉庫、數據湖和數據湖倉

數據倉庫、數據湖和數據湖倉是三種常見的數據存儲和管理技術&#xff0c;各自有不同的特點和適用場景。以下是它們的詳細比較&#xff1a; 1. 數據倉庫&#xff08;Data Warehouse&#xff09; 定義&#xff1a;用于存儲結構化數據&#xff0c;經過清洗、轉換和建模&#xff…

學習aigc

DALLE2 論文 Hierarchical Text-Conditional Image Generation with CLIP Latents [2204.06125] Hierarchical Text-Conditional Image Generation with CLIP LatentsAbstract page for arXiv paper 2204.06125: Hierarchical Text-Conditional Image Generation with CLIP L…

POI pptx轉圖片

前言 ppt頁面預覽一直是個問題&#xff0c;office本身雖然有預覽功能但是收費&#xff0c;一些開源的項目的預覽又不太好用&#xff0c;例如開源的&#xff1a;kkfileview pptx轉圖片 1. 引入pom依賴 我這個項目比較老&#xff0c;使用版本較舊 <dependency><gro…

零基礎學python--------第三節:Python的流程控制語法

Python&#xff0c;浮點數 11.345(單&#xff1a;4個字節&#xff0c; 雙&#xff1a;8個字節) 。 十進制的數字25 ---> 11001 講一個小數轉化為二進制&#xff1a; 不斷的乘以2 。取整數部分。 十進制的0.625 ----> 二進制&#xff1a; 0&#xff0c; 101 。 0.3 ---…

2025.2.21 Restless And Brave

今天是2025年的2月21日&#xff0c;星期五。 距離考研出分還有兩天半的時間。 這種時候&#xff0c;我想考的特別好的同學或者考的特別差的同學都不會太焦慮&#xff0c;只有我這種考的不上不下的人才會焦慮。 我曾不止一次的想過如何面對失敗&#xff0c;但每每想到這個問題…

骶骨神經

骶骨腫瘤手術后遺癥是什么_39健康網_癌癥 [健康之路]匠心仁術&#xff08;七&#xff09; 勇闖禁區 骶骨腫瘤切除術

DeepSeek智能測試知識庫助手PRO版:多格式支持+性能優化

前言 測試工程師在管理測試資產時,需要面對多種文檔格式、大量文件分類及知識庫的構建任務。為了解決這些問題,我們升級了 DeepSeek智能測試知識庫助手,不僅支持更多文檔格式,還加入了 多線程并發處理 和 可擴展格式支持,大幅提升處理性能和靈活性。 主要功能亮點: 多格…