『壹』 C++對一長度為22的數字字元串,無損壓縮為16位字元串,並且可逆。有什麼好的演算法
長度22的數字字元串表示的應該是0至10^23-1
即0到9999....9 (22個9)
一個字元串佔一個位元組8位,理論上最多表示2^8-1,0~255個狀態,
或者說一個位元組無符號整數范圍是0~255
要無損壓縮0至10^23-1范圍內的整數,至少需要二進制77位(23/log10(2))
你所說的16位字元串是只16個字元串把,也就是16位元組,128位吧,
如果是的話,壓縮還是很有冗餘的,要是小於77為二進制數,就不可能無損壓縮了
最簡單的就是用4位二進制碼表示1個十進制數
4位二進制碼有16中可能,取其中的10中可能表示十進制0~1
那麼每兩位十進制數就用一個位元組表示,22位,只需要11個位元組就夠了
數字字元0~9的ascii碼是48~57(十六進制30~39),只保留低四位就是0~9
兩個10進制數給佔4位,佔一個位元組
壓縮編碼的時候,從十進制低位起,每兩個數字一組(個位和十位,百位和千位.....)
(低位的ascii-48) +(高位的ascii-48)*16 獲得一個位元組
22位的數字,能夠獲得11個位元組的數據,如果要16個位元組的話,就有5個位元組的冗餘
解碼的時候,從低到高獲得每個位元組
位元組數據/16的商+48 就是高位的ascii碼
位元組數據/16的余數+48 就是地位的ascii碼
當然乘除可以用移位運算代替,速度更快
『貳』 數字的無損壓縮演算法那些比較合適
一種新的演算法,解決了壓縮比低、壓縮與解壓縮的速度慢和格式不通用的問
題。這個《數字無損壓縮與解壓縮演算法》(下面簡稱演算法)有一個卓越的功能,
就是壓縮、壓縮……在壓縮,最終壓縮結果為900位的數據,註:(每1位只有0
或1兩種狀態),這種演算法也可以對現在的DVD光碟直接進行無損壓縮,壓縮率為
90%以上。演算法結構非常簡單,硬體易構建。是真正意義的無損壓縮,下面簡單
講一下演算法的功能和原理。
功能1、壓縮率為90%以上,如果硬體允許,演算法本身的壓縮率可做到98%以上
,壓縮最小數據量為1200位,壓縮結果為900位的數據。為了有90%的
壓縮率,所以:(1200位+1200位)×2×2=9600位,實際應用最小數
據為9600位,壓縮結果為900位。
2、演算法速度取決硬體構建,因為我對硬體不懂,還不能解釋,但我要說
:演算法結構非常簡單。
3、壓縮對象:只要是一連串的0或1組成的數據,就可以壓縮。不管是圖
像數據,還是音頻數據或各種進制,都能在這一種演算法中進行壓縮與
解壓縮,而壓縮率和速度都是一樣的。
4、實時壓縮與解壓縮,這個還要看硬體構建情況,才能回答,用我個人
的說法是:處處有餘的。
原理1、跟現在的無損壓縮,有損壓縮和混合原理,完全不同,先講布局,布
局是一個45格×45格的正方形,共有2025個空格,用來寄存數據的只
有1200空格,(每1個空格只能寄存0或1兩種狀態),1200個空格既
能寄存1200位的數據量,其餘825個空格另做它用,下面將這個布局
稱為子模型。
2、對子模型進行演算法,定位演算法,只對數據中的1進行定位演算法,不進
行定位演算法的既是0,寫入子模型的1200數據,定位演算法結果數據為900
位。
3、五個子模型,組成一個完整的演算法,數據經過兩次壓縮,原始數據96
00位,壓縮成了900位的數據,每增加1次壓縮,壓縮的數據量就得擴
大為前1次被壓縮的數據量的2倍。既9600位×2=19200位,壓縮結果數據
有是不同的900位,這樣就在次擴大了壓縮率。
原始數據9600位→(壓縮演算法)→壓縮結果數據為900位
001001……1001 001001……10010000
演算法是設計好了,只需專家的鑒定和硬體的構建,希望有更多的專業人士把這
種演算法設計到晶元上去。對《數字無損壓縮與解壓縮》的方法或技術有興趣的朋
友,我們可以一同交流一下。
『叄』 C語言 解壓縮字元串
#include<stdio.h>
intmain()
{
chars[50],s1[100];
inti=0,j=0,k,n;
gets(s);//輸入壓縮後的字元串
while(s[i])
{
s1[j]=s[i];
//因為形式是先字元後數字,所以第一個肯定是字元,先賦入另一個數組以便後續操作。
i++;j++;//遞增,開始處理下一位的數字
n=0;
while(s[i]>='0'&&s[i]<='9')//只要是數字就要進入循環統計
{
n*=10;
n+=s[i]-'0';
i++;
}
for(k=0;k<n-1;k++)
//因為解壓縮的字元已經存入數組s1,所以只剩下n-1要再放入s1
s1[j+k]=s1[j-1];
if(n>0)//注意,一定要n>0因為有可能是連續字元,本來就沒被壓縮這時如果還把j加上n-1就反而是讓j減小了。
j+=n-1;
}
s1[j]='