目次(まとめ)

◾️ ランレングス符号化では、同じ文字が繰り返される文字列を、文字とその繰り返し回数で表記する

◾️ Rubyを使ってランレングス符号化を実現する

◾️ 参考文献


こんにちは、みっちゃんです。

以前の記事で、文字列などの情報をできるだけ少ないビット数で記述するための仕組みである「ハフマン符号化」について紹介しました。

今回の記事では、文字列に含まれる文字を数えることでデータを圧縮する「ランレングス符号化」について紹介します。

ランレングス符号化では、同じ文字が繰り返される文字列を、文字とその繰り返し回数で表記する

Wikipediaによると、ランレングス符号化(Run-length encoding)は、日本の日立製作所が1983年に特許を取得した技術です。

符号化を行う仕組みは、とてもシンプルです。

ここでは「AAAAAAEEEEFFFFFFDGGGGGGGSSSSSS」という30文字からなる文字列をできるだけ短く表現することを目指します。

ランレングス符号化では、同じ文字が繰り返される場合、その文字と繰り返し回数の組み合わせで表現します。

例えば、「AAA」という文字列があれば「A3」と表現します。"A" という文字が "3" 回繰り返されるからです。

したがって、いま考えている30文字からなる文字列は、「A6E4F6D1G7S6」と表記されることになります。

しかし、この符号化はいつも有用であるとは限りません。

例えば、文字の繰り返しを含まないような文字列「ABCDE」をランレングス符号化しようとすると「A1B1C1D1E1」となり、文字の数が倍に増えてしまう(5→10)ことになります。

Rubyを使ってランレングス符号化を実現する

ここでは、Rubyを使って、ランレングス符号化を実現するスクリプト例(test.rb)を示します。

#===test.rb===#

     1:	str = "AAAAAAEEEEFFFFFFDGGGGGGGSSSSSSAAAE"
      	
     2:	# print("#{str}n")
      	
     3:	count = 0
     4:	for i in 1..(str.size) do
     5:	  if(str[i-1] == str[i])
     6:	    count = count + 1
     7:	  else
     8:	    print("#{str[i-1]}#{count+1}")
     9:	    count = 0
    10:	  end
    11:	end
      	
    12:	print("n")

これを実行すると、以下のようにランレングス符号化された文字列が出力されます。

$ ruby test.rb
A6E4F6D1G7S6A3E1

参考文献

きたみりゅうじ「キタミ式イラストIT塾 応用情報技術者」技術評論社