深究字串壓縮 原地壓縮 哈夫曼壓縮(一)

2021-10-03 12:37:20 字數 2020 閱讀 3667

深究字串壓縮系列一共兩大部分,會分別闡述原地壓縮演算法和哈夫曼演算法

本文主要內容是原地壓縮演算法。

如果有乙個字串[a,a,a,b,b,c],如果直接這樣儲存,需6個空間,但如果將其壓縮成[a,3,b,2,c]則只需要5個空間,這樣就實現了一次壓縮。而在壓縮的過程中,不再多使用別的記憶體空間,又將這種演算法稱為原地壓縮演算法。

我們假設所需壓縮的字串都是有序排序的,我們使用兩個指標 read 和 write 分別標記讀和寫的位置。讀寫操作均從左到右進行:讀入連續的一串字元,然後將壓縮版寫到陣列中。最終,write 將指向輸出答案的結尾

。保留指標 anchor,指向當前讀到連續字串的起始位置。

從左到右進行讀取。當讀到最後乙個字元,或者下乙個下乙個字元與當前不同時,則到達連續區塊的結尾。

當我們到達連續區塊的結尾時,就從 write 寫入壓縮的結果。chars[anchor] 為字元,read - anchor + 1 (若大於 1)為長度。

#include

#include

#include

"stdlib.h"

using

namespace std;

class

solution

anchor = read +1;

}}return write;}}

;void

main()

; solution.

compress

(chars)

;}

這就是相關**,由於使用的是c++,所以有一點特殊的地方想著重說明。

原地壓縮演算法本身並不難理解,但我在做的時候,被下面的**段卡住了

unsigned

int len =1;

while

((read - anchor +1)

/10>=10)

len++

;char

* a =

newchar

[len]

;_itoa_s

(read - anchor +

1, a,

(size_t)len +1,

10);for

(int i =

0; i < len; i++

) chars[write++

]= a[i]

;

這段**目的是為了獲取重複字母的數量,並將其轉化成char型別,其中_itoa_s 這個函式,卡住了我很長時間,它的定義如下:

_acrtimp errno_t __cdecl _itoa_s

( _in_ int _value,

//值_out_writes_z_

(_buffercount)

char

* _buffer,

//目的位址

_in_ size_t _buffercount,

//目的位址的空間

_in_ int _radix//進製數

);

其中第三個引數,原本我的理解是和動態宣告的陣列大小一樣,因此我填入了len,當len=1時,程式執行至此就會崩潰,最後我都沒有找到原因,在網上查了很多資料都是沒有什麼價值的內容。最後經過我的多次測試發現,只要令其大於1,程式即可正常執行。

在這裡想補充一段內容,同樣是陣列的賦值,strcpy和memcpy有何區別?

strcpy和memcpy主要有以下3方面的區別。

1.複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。

2.複製的方法不同。strcpy不需要指定長度,它遇到被複製字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。

3.用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy

C語言字串原地壓縮實現方法

字串原地壓縮示例 eeeeeaaaff 壓縮為 e5a3f2 具體功能 如下 copyright c 2011 alexingcool.程式設計客棧 all rights reserved.include include include using na程式設計客棧mespace std char ...

資料結構 演算法之(029)( 字串原地壓縮)

題目 字串原地壓縮,題目描寫敘述 eeeeeaaaff 壓縮為 e5a3f2 請程式設計實現 題目分析 1 原地壓縮,意思是不開闢額外的空間 2 應該考慮單個字元不壓縮,比方 q 壓縮過後還是 q 而不應該是 q1 3 壓縮後某個字元個數是多位數,演算法實現 include include incl...

原地操作 刪除或壓縮 字串 in place

看了兩道題 一道是原地壓縮字串 例如把aaabbcdddd變為a3b2cd4 另一道是,給定乙個字串s和另外乙個字串t,in place操作,刪除s中所有在t中出現過的字元 這種題目都是乙個套路,使用兩個char 的指標,fast和slow 以第二題為例 fast和slow一開始都指向初始的字串s ...