一、整數集合實現整數集合(intset)是redis用於儲存整數值的集合抽象資料結構,它可以儲存型別為int16_t、int32_t或者int64_t的整數值,並且保證集合中不會出現重複元素。
//每個intset結構表示乙個整數集合
typedef struct intset intset;
如上圖,為一int16_t型別的整數集合,我們可以看到陣列中儲存了5個int16_t型別的整數,它們按照從小到大的順序依次排列。這個時候我們思考乙個問題。如果這個時候存入乙個int32_t型別的整數會怎麼樣?記憶體溢位?這個時候就要提到整數集合的公升級。
二、整數集合的公升級2.1 整數集合公升級過程
正如上面所提到的問題,每當我們要將乙個新元素新增到整數集合裡面,並且新元素的型別比整數集合現有所有元素的型別都要長時,整數集合需要先進行公升級,然後才能將新元素新增到整數集合裡面。公升級整數集合並新增新元素主要分三步來進行。
根據新元素的型別,擴充套件整數集合底層陣列的空間大小,並為新元素分配空間。
將底層陣列現有的所有元素都轉換成與新元素相同的型別,並將型別轉換後的元素放置到正確的位上,而且在放置元素的過程中,需要繼續維持底層陣列的有序性質不變。
將新元素新增到底層陣列裡面。
2.2 整數集合公升級的優點
提公升靈活性
因為c語言是靜態型別語言,為了避免型別錯誤,我們通常不會將兩種不同型別的值放在同乙個資料結構裡面。
例如,我們一般只使用int16_t型別的陣列來儲存int16_t型別的值,只使用int32_t型別的陣列來儲存int32_t型別的值,諸如此類。但是,因為整數集合可以通過自動公升級底層陣列來適應新元素,所以我們可以隨意地將int16_t、int32_t或者int64_t型別的整數新增到集合中,而不必擔心出現型別錯誤,這種做法非常靈活。
節約記憶體
要讓乙個陣列可以同時儲存int16_t、int32_t、int64_t三種型別的值,最簡單的做法就是直接使用int64t型別的陣列作為整數集合的底層實現。不過這樣一來,即使新增到整數集合裡面的都是int16_t型別或者int32_t型別的值,陣列都需要使用int64_t型別的空間去儲存它們,從而出現浪費記憶體的情況。
而整數集合現在的做法既可以讓集合能同時儲存三種不同型別的值,又可以確保公升級操作只會在有需要的時候進行,這可以盡量節省記憶體。如果我們一直只向整數集合新增int16_t型別的值,那麼整數集合的底層實現就會一直是int16_t型別的陣列,只有在我們要將int32_t型別或者int64_t型別的值新增到集合時,程式才會對陣列進行公升級。
2.3 降級
整數集合不支援降級操作,一旦對陣列進行了公升級,編碼就會一直保持公升級後的狀態。也就是說一旦我們向乙個int16_t的整數集合內新增了乙個int32_t的元素後,整數集合將公升級到int32_t型別。即使後續的操作中我們刪除了這個元素,整數集合還是會保持int32_t型別的狀態。
三、整數集合常用操作時間複雜度操作
時間複雜度
建立乙個新的整數集合
o(1)
新增指定元素到集合
o(n)
移除指定元素
o(n)
判斷指定元素是否在集合中
o(logn)
隨機返回乙個元素
o(1)
取出在指定索引上的元素
o(1)
返回集合包含的元素個數
o(1)
返回集合占用的記憶體位元組數
o(1)
本文重點1.整數集合是redis自己設計的一種儲存結構,集合鍵的底層實現之一。
2.整數集合的底層實現為陣列,這個陣列以有序、無重複的方式儲存集合元素,在有需要時,程式會根據新新增元素的型別,改變這個陣列的型別。
3.公升級操作為整數集合帶來了操作上的靈活性,並且盡可能地節約了記憶體。
4.整數集合只支援公升級操作,不支援降級操作。
彙編一位數加法
源於朱耀庭老師的 組合語言程式設計 清華大學出版社 大體思路 把結果看成兩位十進位制,add之後把結果除以10,商儲存到al,餘數儲存到ah,有進製結果顯示正常,沒有進製則高位顯示零,低位顯示結果 在32位win7下masm5編譯通過 mov dl,2號功能呼叫顯示問號 mov ah,02h int...
C語言如何不用除法取出整數中的一位數
假定我們提取數字的數最大是個十位數。這個是32位int的最大容量 const intdigitcount 10 void getdigit 這是乙個將輸入的整數分解成十進位制數字的函式 unsigned inta 被提取數字的數 intdigits digitcount 用於接收提取結果的,長度為d...
1062 最左邊一位數
最左邊一位數 time limit 1000ms memory limit 65536k total submit 112 accepted 24 description 對於給定的正整數n,輸出n n的最左邊一位數。input 輸入包含多組測試資料。輸入的第一行是乙個整數t,代表測試組數。隨後輸入...