最小可用Id的命令式解法
在《演算法新解》的前言中,我們只給出了使用分而治之策略的線性時間O(n),常數空間O(1)的解法。這裡我們給出另外兩種命令式解法,它們都可以達到同樣的效能。
首先我們先回顧一下書中討論的一個重要性質
1 <= answer <= n + 1
其中n是序列的長度,當原始序列是1到n的某個排列時,答案為n+1。
鴿籠排序[1]
任何基於比較的排序都會將時間效能降低到O(n lg n),所以諸如堆,排序二叉樹這類的解法無法滿足要求。我們可以將第i個元素x放置到它“應該”在的位置上:也就是第x個位置。如果x比n大,根據上面的公式,我們知道它一定不是答案,因此可以跳過它不做處理。否則,我們將第i個元素和第x個元素交換。由於我們交換到第i個位置上的元素不一定等於i,因此需要不斷重複交換直到第i個元素比n大或者等於i。我們從1到n對i進行迭代,處理所有元素。由於每個元素僅被交換一次,因此這一處理是線性時間的(你能嚴格證明這一結論麼?)。
接下來,我們再次掃描一遍這一序列,如果在任何位置i上,元素值不等於i,我們就找到了最終的答案。否則,說明原始序列是“滿”的,我們返回n+1作為最小可用元素。
下面是一個C風格的C++例子程式碼。
int findMinFree1(vector<int> nums) {
int i, n = nums.size();
for (i = 0; i < n; ++i)
while (nums[i] <= n && nums[i] != i + 1)
swap(nums[i], nums[nums[i] - 1]);
for (i = 0; i < n; ++i)
if (i + 1 != nums[i])
return i + 1;
return n + 1;
}
符號編碼
不論是使用一個標記陣列,還是將每個元素放置到“正確”的位置上,我們本質上是想知道一個元素是否存在。存在與否是一種二值化(binary)資訊。我們可以將其編碼為數字的正負號。思路是如果元素x存在於序列中,我們就將第x個元素從正數反轉為負數。當我們把所有不大於n的元素的正負號都反轉完,我們可以再從左向右掃描一遍序列,找到第一個正數,它所在的位置就是最終的答案。
下面是這一方法的C風格的C++例子程式碼:
int findMinFree2(vector<int> nums) {
int i, k, n = nums.size();
for (i = 0; i < n; ++i)
if ((k = abs(nums[i])) <= n)
nums[k - 1] = - abs(nums[k - 1]);
for (i = 0; i < n; ++i)
if (nums[i] > 0)
return i + 1;
return n + 1;
}
[1] https://en.wikipedia.org/wiki/Pigeonhole_sort
相關文章
- mysql查詢表中最小可用id值MySql
- 【CodeVS】1245 最小的N個和 - Ⅰ - 原題的幾種解法dev
- 手動create database 的可用命令Database
- 分散式高可用 id 伺服器設計實現分散式伺服器
- 第三章:查詢與排序(下)----------- 3.12 實踐_最小可用id是多少排序
- 一條SQL:補充缺失的最小IDSQL
- Travis CI:最小的分散式系統(上)分散式
- CentOS 全域性命令不可用CentOS
- free命令可用記憶體分析記憶體
- 使用者對生成式AI的擔憂,思科有哪些解法?AI
- Golang 分散式 ID 生成系統,高效能、高可用、易擴充套件的 id 生成服務Golang分散式套件
- 「如何設計」高可用的分散式鎖分散式
- Jquery庫的一些可用函式jQuery函式
- jeesz分散式架構-分散式高可用分散式架構
- 簡約之道 - 最小化介面設計的組成要素及可用性分析
- 簡約之道 – 最小化介面設計的組成要素及可用性分析
- DBNEWID的用法----NID命令
- LeetCode Valid Parentheses(020)解法總結LeetCode
- RMQ問題的各種解法MQ
- Circuit: Go語言編寫的最小分散式程式設計式的作業系統UIGo分散式程式設計作業系統
- topK問題解法TopK
- 分散式儲存高可用設計分散式
- keepalived 高可用(非搶佔式)
- Laravel 的命令版 Siri — 互動式生成命令Laravel
- RAID的基礎命令AI
- [android]android-am命令的使用Android
- Linux系統檢視磁碟可用空間的5個命令Linux
- 遞推方程的特徵方程解法特徵
- JavaScript的two-sum問題解法JavaScript
- 微分方程的數值解法 6
- 基於MFS高可用的分散式儲存架構分散式架構
- 分散式架構的高效能與可用性分散式架構
- 最小的 Swift AppSwiftAPP
- 最小的Swift AppSwiftAPP
- 系統最小的服務最小的許可權最大的安全。
- mysql刪除重複記錄,儲存Id最小的一條MySql
- Redis高可用分散式內部交流(九)Redis分散式
- 【高數覆盤】3.5函式的極值與最大最小值函式