JP2016091488A - データソート方法およびプログラム - Google Patents
データソート方法およびプログラム Download PDFInfo
- Publication number
- JP2016091488A JP2016091488A JP2014228662A JP2014228662A JP2016091488A JP 2016091488 A JP2016091488 A JP 2016091488A JP 2014228662 A JP2014228662 A JP 2014228662A JP 2014228662 A JP2014228662 A JP 2014228662A JP 2016091488 A JP2016091488 A JP 2016091488A
- Authority
- JP
- Japan
- Prior art keywords
- data
- string
- data string
- sorting
- strings
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
【課題】処理時間が高速かつ一定で、少ないメモリ使用量でソートを実現する。【解決手段】N個のデータに対し、2データ、4データ、・・・、Nデータの並び替えを再帰的に行うマージソートで2つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行い(S104)、第2のデータ列に対してソートを実施する(S105)。ブロック交換マージは、n個(n=1,2,・・・,N/2)の第1のデータ列と隣接するn個の第2のデータ列について、第1のデータ列のm番目のデータと第2のデータ列の1番目のデータとを大小比較し、第2のデータ列の1番目のデータの方が小さいときに、第1のデータ列のm番目以降の{n−(m−1)}個のデータと第2のデータ列の1番目以降の{n−(m−1)}個のデータを交換する処理を、m=1からm=nまで行う処理である。【選択図】 図8
Description
本発明は、データを昇順または降順に並び替えるデータソート方法およびプログラムに関するものである。
データを昇順または降順に並び替えるソート作業はあらゆる分野で必要である。例えば電磁流量計では多重レンジの判定で設定データの並べ替えが必要であり、処理に時間がかかっていた。このようなソートを実現するアルゴリズムは従来から多数提案されている(非特許文献1参照)。
通常、処理時間が一定で確実なソートアルゴリズムとしては総当たり方式が使われるが、この総当たり方式は、要素の数が大きくなると非常に時間がかかる。総当たり方式を高速化したソートアルゴリズムとしてはクイックソートがあるが、クイックソートは、データの比較回数がデータの並びに依存するため、最悪の場合、総当たり方式と変わらない比較回数になってしまうことがある。また、クイックソートは、処理時間が一定でないため、リアルタイムで動くシステムに適用することが難しいという問題点があった。
また、別のソートアルゴリズムとして、図14に示すようにツリー状にデータを分割して下位から個別にソートした後2つのデータ列をマージする作業を繰り返すというマージソートが知られている(非特許文献2参照)。
"ソート",ウィキペディア,<http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88>
"C言語講座 マージソート",YFプロ,<http://www1.cts.ne.jp/~clab/hsample/Sort/Sort6.html>
以上のように、従来からソートアルゴリズムは数々提案されているが、組み込み機器に実装できるようなコンパクトで、ワークメモリを使用せず、処理時間が一定で、高速なものがないという問題点があった。
上記のとおり、クイックソートは、データの比較回数がデータの並びに依存するため、処理時間が一定でなく、リアルタイムで動くシステムに実装することが難しいという問題点があった。また、マージソートは、データ列をマージする際、データの格納された領域と同じサイズのワークメモリが必要なため、組み込み機器などメモリ使用量に制約のあるシステムに実装することが難しいという問題点があった。
本発明は、上記課題を解決するためになされたもので、処理時間が高速かつ一定で、プログラムサイズが小さく、少ないメモリ使用量で実現することができるデータソート方法およびプログラムを提供することを目的とする。
本発明は、CPUと記憶装置とを備えたデータソート装置においてN個(N=2kの整数で、kは1以上の整数)のデータのソートを行うデータソート方法において、2データ、4データ、8データ、・・・、Nデータの並び替えを再帰的にツリー構造で行うマージソートで2つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、第2のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記CPUに実行させ、前記ブロック交換マージは、2つの並び終えたn個(n=1,2,4,8,・・・,N/2)の第1のデータ列とこの第1のデータ列に隣接するn個の第2のデータ列とについて、前記第1のデータ列のm番目(mは1以上n以下の整数)のデータと前記第2のデータ列の1番目のデータとを大小比較し、前記第2のデータ列の1番目のデータの方が小さいときに、前記第1のデータ列のm番目以降の{n−(m−1)}個のデータと前記第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理を、m=1からm=nまで順次行う処理であることを特徴とするものである。
また、本発明のデータソート方法は、2データ、4データ、8データ、・・・、Nデータの並び替えを再帰的にツリー構造で行うマージソートで2つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、第2のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記CPUに実行させ、前記ブロック交換マージは、2つの並び終えたn個(n=1,2,4,8,・・・,N/2)の第1のデータ列とこの第1のデータ列に隣接するn個の第2のデータ列とについて、前記第1のデータ列のm番目(mは1以上n以下の整数)のデータと前記第2のデータ列の1番目のデータとを大小比較し、前記第2のデータ列の1番目のデータの方が大きいときに、前記第1のデータ列のm番目以降の{n−(m−1)}個のデータと前記第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理を、m=1からm=nまで順次行う処理であることを特徴とするものである。
また、本発明は、CPUと記憶装置とを備えたコンピュータをデータソート装置として機能させ、N個(N=2kの整数で、kは1以上の整数)のデータのソートを行うデータソートプログラムにおいて、2データ、4データ、8データ、・・・、Nデータの並び替えを再帰的にツリー構造で行うマージソートで2つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、第2のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記CPUに実行させ、前記ブロック交換マージは、2つの並び終えたn個(n=1,2,4,8,・・・,N/2)の第1のデータ列とこの第1のデータ列に隣接するn個の第2のデータ列とについて、前記第1のデータ列のm番目(mは1以上n以下の整数)のデータと前記第2のデータ列の1番目のデータとを大小比較し、前記第2のデータ列の1番目のデータの方が小さいときに、前記第1のデータ列のm番目以降の{n−(m−1)}個のデータと前記第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理を、m=1からm=nまで順次行う処理であることを特徴とするものである。
また、本発明のデータソートプログラムは、2データ、4データ、8データ、・・・、Nデータの並び替えを再帰的にツリー構造で行うマージソートで2つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、第2のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記CPUに実行させ、前記ブロック交換マージは、2つの並び終えたn個(n=1,2,4,8,・・・,N/2)の第1のデータ列とこの第1のデータ列に隣接するn個の第2のデータ列とについて、前記第1のデータ列のm番目(mは1以上n以下の整数)のデータと前記第2のデータ列の1番目のデータとを大小比較し、前記第2のデータ列の1番目のデータの方が大きいときに、前記第1のデータ列のm番目以降の{n−(m−1)}個のデータと前記第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理を、m=1からm=nまで順次行う処理であることを特徴とするものである。
本発明によれば、処理時間が高速かつ一定で、プログラムサイズが小さく、ワークメモリを使用せず、少ないメモリ使用量で実行可能なデータソート方法を実現することができる。本発明のデータソート方法は、データの比較回数が一定であり、処理時間が一定のため、リアルタイムで動くシステムに実装することができる。また、本発明のデータソート方法は、ワークメモリを必要としないため、組み込み機器などメモリ使用量に制約のあるシステムに実装することができる。
以下、本発明の実施の形態について図面を参照して説明する。図1は本発明の実施の形態に係るデータソート装置の構成を示すブロック図である。データソート装置1は、プロセッサや記憶装置からなるハードウェアと、これらのハードウェアと協働して各種機能を実現させるプログラムとによって実現される。
図1において、1−1はCPU、1−2はRAM、1−3はROM、1−4はハードディスク装置、1−5,1−6はインターフェイス(I/F)である。CPU1−1は、I/F1−5を介して与えられるデータを得て、RAM1−2にアクセスしながら、ROM1−3やハードディスク装置1−4等の記憶装置に格納されたプログラムに従って以下の処理を実行し、ソート結果をI/F1−6を介して出力する。
本実施の形態のソートプログラムは、予めROM1−3に記録されている。なお、ソートプログラムは、例えばCD−ROM、DVD−ROM、メモリカードなどの記録媒体に記録された状態で提供され、この記録媒体から読み出されてハードディスク装置1−4にインストールされる形態であってもよい。
なお、図1のデータソート装置1の構成は1例であって、データソート装置1をコントローラ等の機器に組み込む場合と、PC(Personal Computer)で実現する場合とでは構成が異なることは言うまでもない。いずれの場合においても、ハードウェアとソフトウェアの協働によって本実施の形態のデータソート方法が実現される。
図2は本実施の形態のデータソート方法の概念を説明する図である。本実施の形態では、2つの並び終えたn個(nは1以上の整数で、n=1,2,4,8,・・・,N/2)の第1のデータ列とこの第1のデータ列に隣接するn個の第2のデータ列とについて、第1のデータ列のm番目(mは1以上n以下の整数)のデータと第2のデータ列の1番目のデータとを大小比較し、第2のデータ列の1番目のデータの方が小さいときに、第1のデータ列のm番目以降の{n−(m−1)}個のデータと第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理を、m=1からm=nまで順次行う処理をマージ処理(ブロック交換マージ)とする。Nはデータ全体の個数である(N=2kの整数で、kは1以上の整数)。
図2の例では、n=1個の第1のデータ列100とこれに隣接するn=1個の第2のデータ列101とについて並び替えを行い、2つのデータ列をマージして、n=2個の第1のデータ列200とこれに隣接するn=2個の第2のデータ列201とについて並び替えを行い、2つのデータ列をマージして、n=4個の第1のデータ列300とこれに隣接するn=4個の第2のデータ列301とについて並び替えを行い、2つのデータ列をマージして、n=8個の第1のデータ列400とこれに隣接するn=8個の第2のデータ列401とについて並び替えを行い、2つのデータ列をマージするという処理を繰り返す。
例えばN=16の場合、16データの並び替えの前に8データの並び替えが必要で、8データの並び替えの前に4データの並び替えが必要で、4データの並び替えの前に2データの並び替えが必要である。
図3は2データの並び替え(n=1個の第1のデータ列100とn=1個の第2のデータ列101の並び替え)後のマージ処理を説明する図である。2データの並び替えでは、n=1個の第1のデータ列100とn=1個の第2のデータ列101とを比較して、第2のデータ列101の方が小さいときに第1のデータ列100と第2のデータ列101とを交換することになる。
図3は2データの並び替え(n=1個の第1のデータ列100とn=1個の第2のデータ列101の並び替え)後のマージ処理を説明する図である。2データの並び替えでは、n=1個の第1のデータ列100とn=1個の第2のデータ列101とを比較して、第2のデータ列101の方が小さいときに第1のデータ列100と第2のデータ列101とを交換することになる。
図4(A)〜図4(C)は4データの並び替え(n=2個の第1のデータ列200とn=2個の第2のデータ列201の並び替え)後のマージ処理を説明する図である。4データの並び替え後のマージ処理では、n=2個の第1のデータ列200の1番目のデータとn=2個の第2のデータ列201の1番目のデータとを大小比較し、第2のデータ列201の1番目のデータの方が小さいときに、第1のデータ列200の1番目以降の{n−(m−1)}=2個のデータと第2のデータ列201の1番目以降の{n−(m−1)}=2個のデータとを交換する(図4(A))。
続いて、第1のデータ列200の2番目のデータと第2のデータ列201の1番目のデータとを大小比較し、第2のデータ列201の1番目のデータの方が小さいときに、第1のデータ列200の2番目以降の{n−(m−1)}=1個のデータと第2のデータ列201の1番目以降の{n−(m−1)}=1個のデータとを交換する(図4(B))。さらに、第2のデータ列201に対して2データの並び替え処理を行う(図4(C))。
図5(A)〜図5(E)は8データの並び替え(n=4個の第1のデータ列300とn=4個の第2のデータ列301の並び替え)後のマージ処理を説明する図である。8データの並び替え後のマージ処理では、n=4個の第1のデータ列300の1番目のデータとn=4個の第2のデータ列301の1番目のデータとを大小比較し、第2のデータ列301の1番目のデータの方が小さいときに、第1のデータ列300の1番目以降の{n−(m−1)}=4個のデータと第2のデータ列の1番目以降の{n−(m−1)}=4個のデータとを交換する(図5(A))。
次に、第1のデータ列300の2番目のデータと第2のデータ列301の1番目のデータとを大小比較し、第2のデータ列301の1番目のデータの方が小さいときに、第1のデータ列300の2番目以降の{n−(m−1)}=3個のデータと第2のデータ列301の1番目以降の{n−(m−1)}=3個のデータとを交換する(図5(B))。続いて、第1のデータ列300の3番目のデータと第2のデータ列301の1番目のデータとを大小比較し、第2のデータ列301の1番目のデータの方が小さいときに、第1のデータ列300の3番目以降の{n−(m−1)}=2個のデータと第2のデータ列301の1番目以降の{n−(m−1)}=2個のデータとを交換する(図5(C))。
さらに、第1のデータ列300の4番目のデータと第2のデータ列301の1番目のデータとを大小比較し、第2のデータ列301の1番目のデータの方が小さいときに、第1のデータ列300の4番目以降の{n−(m−1)}=1個のデータと第2のデータ列301の1番目以降の{n−(m−1)}=1個のデータとを交換する(図5(D))。最後に、第2のデータ列301に対して4データの並び替え処理を行う(図5(E))。
図6(A)〜図6(G)は16データの並び替え(n=8個の第1のデータ列400とn=8個の第2のデータ列401の並び替え)後のマージ処理を説明する図である。16データの並び替え後のマージ処理では、n=8個の第1のデータ列400の1番目のデータとn=8個の第2のデータ列401の1番目のデータとを大小比較し、第2のデータ列401の1番目のデータの方が小さいときに、第1のデータ列400の1番目以降の{n−(m−1)}=8個のデータと第2のデータ列の1番目以降の{n−(m−1)}=8個のデータとを交換する(図6(A))。
次に、第1のデータ列400の2番目のデータと第2のデータ列401の1番目のデータとを大小比較し、第2のデータ列401の1番目のデータの方が小さいときに、第1のデータ列400の2番目以降の{n−(m−1)}=7個のデータと第2のデータ列401の1番目以降の{n−(m−1)}=7個のデータとを交換する(図6(B))。続いて、第1のデータ列400の3番目のデータと第2のデータ列401の1番目のデータとを大小比較し、第2のデータ列401の1番目のデータの方が小さいときに、第1のデータ列400の3番目以降の{n−(m−1)}=6個のデータと第2のデータ列401の1番目以降の{n−(m−1)}=6個のデータとを交換する(図6(C))。
さらに、第1のデータ列400の4番目のデータと第2のデータ列401の1番目のデータとを大小比較し、第2のデータ列401の1番目のデータの方が小さいときに、第1のデータ列400の4番目以降の{n−(m−1)}=5個のデータと第2のデータ列401の1番目以降の{n−(m−1)}=5個のデータとを交換する(図6(D))。同様の処理を繰り返し、第1のデータ列400の8番目のデータと第2のデータ列401の1番目のデータとを大小比較し、第2のデータ列401の1番目のデータの方が小さいときに、第1のデータ列400の8番目以降の{n−(m−1)}=1個のデータと第2のデータ列401の1番目以降の{n−(m−1)}=1個のデータとを交換する(図6(E))。これで、第1のデータ列400の順番は確定する(図6(F))。最後に、第2のデータ列401に対して8データの並び替え処理を行う(図6(G))。
図7(A)〜図7(G)はNデータの並び替え(n=N/2個の第1のデータ列500とn=N/2個の第2のデータ列501の並び替え)後のマージ処理を説明する図である。この場合のマージ処理も上記と同様なので、詳細な説明は省略する。
次に、図8を用いて本実施の形態のデータソート方法を詳細に説明する。図8において、「sortn(p,n)」のpはデータ列の先頭を表し、nはデータ数を表す。
まず、CPU1−1は、データを第1のデータ列と第2のデータ列に分割する(図8ステップS100)。なお、ステップS100の「n=n/2」における右辺のnは分割前のデータ数を表しており、左辺のnは分割後の第1のデータ列と第2のデータ列のそれぞれのデータ数を表している。したがって、ステップS100以降の処理のnは分割後のデータ数となる。
まず、CPU1−1は、データを第1のデータ列と第2のデータ列に分割する(図8ステップS100)。なお、ステップS100の「n=n/2」における右辺のnは分割前のデータ数を表しており、左辺のnは分割後の第1のデータ列と第2のデータ列のそれぞれのデータ数を表している。したがって、ステップS100以降の処理のnは分割後のデータ数となる。
次に、CPU1−1は、分割後のnが1より小さいかどうかを判定する(図8ステップS101)。分割後のnが1以上の場合、CPU1−1は、n個の第1のデータ列を昇順に並び替えるソートを行い(図8ステップS102)、n個の第2のデータ列を昇順に並び替えるソートを行う(図8ステップS103)。ステップS103におけるp+nは第2のデータ列を表している。
続いて、CPU1−1は、n個の第1のデータ列とn個の第2のデータ列をマージ(上記のブロック交換マージ)する(図8ステップS104)。さらに、CPU1−1は、n個の第2のデータ列をソートする(図8ステップS105)。第2のデータ列のソート終了後、次の処理に移る(図8ステップS106)。また、ステップS101において、分割後のnが1より小さい場合も次の処理に移る(図8ステップS107)。
図9は本実施の形態のブロック交換マージ(ステップS104)を説明するフローチャートである。図9において、「merge(p,n)」のpはデータ列の先頭を表し、nはデータ数を表す。ブロック交換マージにおいて、CPU1−1は、第1のデータ列のデータに付与する番号iを0に初期化する(図9ステップS200)。
次に、CPU1−1は、n個の第1のデータ列p[0]〜p[n−1]とこれに隣接するn個の第2のデータ列p[n]〜p[2n−1]とについて、第1のデータ列の1番目(i=0)のデータp[0]と第2のデータ列の1番目のデータp[n]とを大小比較する(図9ステップS201)。CPU1−1は、第2のデータ列の1番目のデータp[n]の方が小さいときに、ブロック交換するデータを決定するための変数jを0に初期化し(図9ステップS202)、第1のデータ列の1番目(0+0=0)のデータp[0]と第2のデータ列の1番目のデータp[n+0]とを交換する(図9ステップS203)。
続いて、CPU1−1は、変数jを1増やし(図9ステップS204)、変数jが(n−i)以上であれば(図9ステップS205においてYES)、ステップS206に進み、変数jが(n−i)未満であれば(ステップS205においてNO)、ステップS203に戻る。変数jが(n−i)未満である場合、CPU1−1は、第1のデータ列の2番目(0+1=1)のデータp[1]と第2のデータ列の2番目のデータp[n+1]とを交換する(ステップS203)。
CPU1−1は、変数jを1増やし(ステップS204)、変数jが(n−i)未満であれば、第1のデータ列の3番目(0+2=2)のデータp[2]と第2のデータ列の3番目のデータp[n+2]とを交換する(図9ステップS203)。こうして、変数jが(n−i)以上となるまで、ステップS203〜S205の処理を繰り返す。このステップS203〜S205の繰り返しは、第1のデータ列のm番目以降の{n−(m−1)}個のデータと第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理に相当する。
次に、CPU1−1は、ステップS205において変数jが(n−i)以上の場合、変数iを1増やし(図9ステップS206)、変数iがn未満の場合(図9ステップS207において判定NO)、ステップS201に戻る。
CPU1−1は、n個の第1のデータ列p[0]〜p[n−1]とn個の第2のデータ列p[n]〜p[2n−1]とについて、第1のデータ列の2番目(i=1)のデータp[1]と第2のデータ列の1番目のデータp[n]とを大小比較する(ステップS201)。CPU1−1は、第2のデータ列の1番目のデータp[n]の方が小さいときに、変数jを0に初期化し(ステップS202)、第1のデータ列の2番目(1+0=1)のデータp[0]と第2のデータ列の1番目のデータp[n+0]とを交換する(ステップS203)。
続いて、CPU1−1は、変数jを1増やし(ステップS204)、変数jが(n−i)未満であれば(ステップS205において判定NO)、第1のデータ列の3番目(1+1=2)のデータp[2]と第2のデータ列の2番目のデータp[n+1]とを交換する(ステップS203)。
CPU1−1は、変数jを1増やし(ステップS204)、変数jが(n−i)未満であれば、第1のデータ列の4番目(1+2=3)のデータp[3]と第2のデータ列の3番目のデータp[n+2]とを交換する(ステップS203)。こうして、変数jが(n−i)以上となるまで、ステップS203〜S205の処理を繰り返す。
次に、CPU1−1は、ステップS205において変数jが(n−i)以上の場合、変数iを1増やし(ステップS206)、変数iがn未満の場合(ステップS207において判定NO)、ステップS201に戻る。こうして、変数iがn以上となるまで、ステップS201〜S207の処理を繰り返し実行する。このステップS201〜S207の繰り返しは、データの比較交換を、m=1からm=nまで順次行う処理に相当する。変数iがn以上となった時点で、ブロック交換マージを終える(図9ステップS208)。
次に、本実施の形態のデータソート方法の実例を図10(A)〜図10(N)、図11(A)〜図11(F)を用いて説明する。ここでは、N=2k=23=8個で、図10(A)に示すように「8,3,5,1,7,4,6,2」という並びのデータをソートする例について説明する。
図10(B)は図10(A)の並びのデータにおいて、ステップS102のソート処理によりn=1個の第1のデータ列「8」を並び替え、ステップS103のソート処理によりn=1個の第2のデータ列「3」を並び替え、ステップS104のブロック交換マージにより「8」と「3」とを交換し、さらにステップS105のソート処理により第2のデータ列「8」を並び替えた後の状態を示している。なお、n=1なので、実際にはステップS102,S103,S105のソート処理は行われないことは言うまでもない。
図8においては、n=1個の第1のデータ列「8」とn=1個の第2のデータ列「3」について、ステップS102〜S105の処理が終了した後に、ステップS106のreturnで次の処理、すなわちn=1個の第1のデータ列「5」とn=1個の第2のデータ列「1」についての処理が行われる。
図10(C)は図10(B)の並びのデータにおいて、ステップS102のソート処理によりn=1個の第1のデータ列「5」を並び替え、ステップS103のソート処理によりn=1個の第2のデータ列「1」を並び替え、ステップS104のブロック交換マージにより「5」と「1」とを交換し、さらにステップS105のソート処理により第2のデータ列「5」を並び替えた後の状態を示している。なお、n=1なので、実際にはステップS102,S103,S105のソート処理は行われない。
n=1個の第1のデータ列とn=1個の第2のデータ列について未処理のデータ列がなくなると、ステップS100の処理によりnを分割するが、nが1より小さくなるので(ステップS101において判定YES)、ステップS107のreturnで次の処理、すなわちn=2の処理が行われる。
図10(D)は図10(C)の並びのデータにおいて、ステップS102のソート処理によりn=2個の第1のデータ列「38」を並び替え、ステップS103のソート処理によりn=2個の第2のデータ列「15」を並び替え、ステップS104のブロック交換マージによりn=2個の第1のデータ列「38」のm=1番目のデータ「3」とn=2個の第2のデータ列「15」の1番目のデータ「1」とを比較し、「38」と「15」とを交換した後の状態を示している。
図10(E)は図10(D)の並びのデータにおいて、ステップS105のブロック交換マージにより、n=2個の第1のデータ列「15」のm=2番目のデータ「5」とn=2個の第2のデータ列「38」の1番目のデータ「3」とを比較し、「5」と「3」とを交換した後の状態を示している。
図10(F)は図10(E)の並びのデータにおいて、ステップS105のソート処理により、n=1個の第1のデータ列「5」とn=1個の第2のデータ列「8」とを比較した後の状態を示している。ここでは、「8」の方が大きいので、「5」と「8」の交換は行われないことは言うまでもない。
図10(G)は図10(F)の並びのデータにおいて、ステップS102のソート処理によりn=1個の第1のデータ列「7」を並び替え、ステップS103のソート処理によりn=1個の第2のデータ列「4」を並び替え、ステップS104のブロック交換マージにより「7」と「4」とを交換し、さらにステップS105のソート処理により第2のデータ列「7」を並び替えた後の状態を示している。なお、n=1なので、実際にはステップS102,S103,S105のソート処理は行われない。
図10(H)は図10(G)の並びのデータにおいて、ステップS102のソート処理によりn=1個の第1のデータ列「6」を並び替え、ステップS103のソート処理によりn=1個の第2のデータ列「2」を並び替え、ステップS104のブロック交換マージにより「6」と「2」とを交換し、さらにステップS105のソート処理により第2のデータ列「6」を並び替えた後の状態を示している。なお、n=1なので、実際にはステップS102,S103,S105のソート処理は行われない。
n=1個の第1のデータ列とn=1個の第2のデータ列について未処理のデータ列がなくなると、ステップS100の処理によりnを分割するが、nが1より小さくなるので(ステップS101において判定YES)、ステップS107のreturnで次の処理、すなわちn=2の処理が行われる。
なお、図10(A)のデータに対するソート処理およびブロック交換マージと、図10(B)のデータに対するソート処理およびブロック交換マージと、図10(F)のデータに対するソート処理およびブロック交換マージと、図10(G)のデータに対するソート処理およびブロック交換マージとを分けて記述しているが、図8のフローチャートでは、図10(A)、図10(B)、図10(F)、図10(G)のデータに対する処理が順番に実行される。
次に、図10(I)は図10(H)の並びのデータにおいて、ステップS102のソート処理によりn=2個の第1のデータ列「47」を並び替え、ステップS103のソート処理によりn=2個の第2のデータ列「26」を並び替え、ステップS104のブロック交換マージによりn=2個の第1のデータ列「47」のm=1番目のデータ「4」とn=2個の第2のデータ列「26」の1番目のデータ「2」とを比較し、「47」と「26」とを交換した後の状態を示している。
図10(J)は図10(I)の並びのデータにおいて、ステップS105のブロック交換マージにより、n=2個の第1のデータ列「26」のm=2番目のデータ「6」とn=2個の第2のデータ列「47」の1番目のデータ「4」とを比較し、「6」と「4」を交換した後の状態を示している。
図10(K)は図10(J)の並びのデータにおいて、ステップS105のソート処理により、n=1個の第1のデータ列「6」とn=1個の第2のデータ列「7」とを比較した後の状態を示している。ここでは、「7」の方が大きいので、「6」と「7」の交換は行われないことは言うまでもない。
n=1個の第1のデータ列とn=1個の第2のデータ列について未処理のデータ列がなくなると、ステップS100の処理によりnを分割するが、nが1より小さくなるので(ステップS101において判定YES)、ステップS107のreturnで次の処理、すなわちn=4の処理が行われる。
なお、図10(C)のデータに対するソート処理およびブロック交換マージと、図10(D)のデータに対するソート処理およびブロック交換マージと、図10(H)のデータに対するソート処理およびブロック交換マージと、図10(I)のデータに対するソート処理およびブロック交換マージとを分けて記述しているが、図8のフローチャートでは、図10(C)、図10(D)、図10(H)、図10(I)のデータに対する処理が順番に実行される。
次に、図10(L)は図10(K)の並びのデータにおいて、ステップS102のソート処理によりn=4個の第1のデータ列「1358」を並び替え、ステップS103のソート処理によりn=4個の第2のデータ列「2467」を並び替え、ステップS104のブロック交換マージにより、n=4個の第1のデータ列「1358」のm=1番目のデータ「1」とn=4個の第2のデータ列「2467」の1番目のデータ「2」とを比較した後の状態を示している。ここでは、「2」の方が大きいので、「1358」と「2467」の交換は行われないことは言うまでもない。
図10(M)は図10(L)の並びのデータにおいて、ステップS104のブロック交換マージにより、n=4個の第1のデータ列「1358」のm=2番目のデータ「3」とn=4個の第2のデータ列「2467」の1番目のデータ「2」とを比較し、「358」と「246」とを交換した後の状態を示している。
図10(N)は図10(M)の並びのデータにおいて、ステップS104のブロック交換マージにより、n=4個の第1のデータ列「1246」のm=3番目のデータ「4」とn=4個の第2のデータ列「3587」の1番目のデータ「3」とを比較し、「46」と「35」とを交換した後の状態を示している。
図11(A)は図10(N)の並びのデータにおいて、ステップS104のブロック交換マージにより、n=4個の第1のデータ列「1235」のm=4番目のデータ「5」とn=4個の第2のデータ列「4687」の1番目のデータ「4」とを比較し、「5」と「4」とを交換した後の状態を示している。
図11(B)は図11(A)の並びのデータにおいて、ステップS105のソート処理により、n=1個の第1のデータ列「5」とn=1個の第2のデータ列「6」とを比較した後の状態を示している。ここでは、「6」の方が大きいので、「5」と「6」の交換は行われないことは言うまでもない。
図11(C)は図11(B)の並びのデータにおいて、ステップS105のソート処理により、n=1個の第1のデータ列「8」とn=1個の第2のデータ列「7」とを比較し、「8」と「7」とを交換した後の状態を示している。
図11(D)は図11(C)の並びのデータにおいて、ステップS105のソート処理により、n=2個の第1のデータ列「56」のm=1番目のデータ「5」とn=2個の第2のデータ列「78」の1番目のデータ「7」とを比較した後の状態を示している。ここでは、「7」の方が大きいので、「56」と「78」の交換は行われないことは言うまでもない。
図11(E)は図11(D)の並びのデータにおいて、ステップS105のソート処理により、n=2個の第1のデータ列「56」のm=2番目のデータ「6」とn=2個の第2のデータ列「78」の1番目のデータ「7」とを比較した後の状態を示している。ここでは、「7」の方が大きいので、「6」と「7」の交換は行われないことは言うまでもない。
図11(F)は図11(E)の並びのデータにおいて、ステップS105のソート処理により、n=1個の第1のデータ列「7」とn=1個の第2のデータ列「8」とを比較した後の状態を示している。ここでは、「8」の方が大きいので、「7」と「8」の交換は行われないことは言うまでもない。以上で、ソートが終了する。この例では、データの比較が19回、データの交換が12回でソートが終了した。
なお、ステップS102,S103,S105の各処理では、図8に示した関数を呼び出し、データの並び替えを再帰的にツリー構造で行う。例えばN=4データが対象であれば、まずn=1個について図8の処理を行い(例えば図11(A)、図11(B)のデータに対する処理)、次にn=2個について図8の処理を行い(例えば図11(C)、図11(D)のデータに対する処理)を行い、n=N/2=2まで終えた時点で、さらに第2のデータ列について図8の処理を行う(例えば図11(E)のデータに対する処理)。
本実施の形態のデータソート方法の処理をC言語で記述したプログラムを図12に示す。また、従来のマージソート方法の処理をC言語で記述したプログラムを図13に示す。また、本実施の形態のデータソート方法と従来の総当たり方式におけるデータの比較回数を表1に示す。
本実施の形態では、データの比較回数はデータの並びに依存せず、データ数Nが同じであれば、データの比較回数は一定である。本実施の形態は従来のマージソートの改良であり、ワークメモリを確保することなくデータの格納された領域内でデータ交換を繰り返すことで並び替え済みの2つの要素をマージする処理を実現した。本実施の形態のデータソート方法は、図12に示すようにプログラムで記述すると、非常に単純なアルゴリズムになるので、プログラムサイズを小さくすることができる。
以上のように、本実施の形態では、処理時間が高速かつ一定で、プログラムサイズが小さく、ワークメモリを使用せず、少ないメモリ使用量で実行可能なデータソート方法を実現することができる。本実施の形態のデータソート方法は、データの比較回数が一定であり、処理時間が一定のため、リアルタイムで動くシステムに実装することができる。また、本実施の形態のデータソート方法は、ワークメモリを必要としないため、組み込み機器などメモリ使用量に制約のあるシステムに実装することができる。
なお、本実施の形態では、データを昇順に並び替える例で説明しているが、データを降順に並び替えることもできる。データを降順に並び替える場合には、第1のデータ列と第2のデータ列を降順に並び替えるソートを行い、ブロック交換マージについては、2つの並び終えたn個(n=1,2,4,8,・・・,N/2)の第1のデータ列とこの第1のデータ列に隣接するn個の第2のデータ列とについて、第1のデータ列のm番目(mは1以上n以下の整数)のデータと第2のデータ列の1番目のデータとを大小比較し、第2のデータ列の1番目のデータの方が大きいときに、第1のデータ列のm番目以降の{n−(m−1)}個のデータと第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理を、m=1からm=nまで順次行う処理とすればよい。
本発明は、データを昇順または降順に並び替える技術に適用することができる。
1…データソート装置、1−1…CPU、1−2…RAM、1−3…ROM、1−4…ハードディスク装置、1−5,1−6…インターフェイス。
Claims (4)
- CPUと記憶装置とを備えたデータソート装置においてN個(N=2kの整数で、kは1以上の整数)のデータのソートを行うデータソート方法において、
2データ、4データ、8データ、・・・、Nデータの並び替えを再帰的にツリー構造で行うマージソートで2つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、
第2のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記CPUに実行させ、
前記ブロック交換マージは、2つの並び終えたn個(n=1,2,4,8,・・・,N/2)の第1のデータ列とこの第1のデータ列に隣接するn個の第2のデータ列とについて、前記第1のデータ列のm番目(mは1以上n以下の整数)のデータと前記第2のデータ列の1番目のデータとを大小比較し、前記第2のデータ列の1番目のデータの方が小さいときに、前記第1のデータ列のm番目以降の{n−(m−1)}個のデータと前記第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理を、m=1からm=nまで順次行う処理であることを特徴とするデータソート方法。 - CPUと記憶装置とを備えたデータソート装置においてN個(N=2kの整数で、kは1以上の整数)のデータのソートを行うデータソート方法において、
2データ、4データ、8データ、・・・、Nデータの並び替えを再帰的にツリー構造で行うマージソートで2つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、
第2のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記CPUに実行させ、
前記ブロック交換マージは、2つの並び終えたn個(n=1,2,4,8,・・・,N/2)の第1のデータ列とこの第1のデータ列に隣接するn個の第2のデータ列とについて、前記第1のデータ列のm番目(mは1以上n以下の整数)のデータと前記第2のデータ列の1番目のデータとを大小比較し、前記第2のデータ列の1番目のデータの方が大きいときに、前記第1のデータ列のm番目以降の{n−(m−1)}個のデータと前記第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理を、m=1からm=nまで順次行う処理であることを特徴とするデータソート方法。 - CPUと記憶装置とを備えたコンピュータをデータソート装置として機能させ、N個(N=2kの整数で、kは1以上の整数)のデータのソートを行うデータソートプログラムにおいて、
2データ、4データ、8データ、・・・、Nデータの並び替えを再帰的にツリー構造で行うマージソートで2つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、
第2のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記CPUに実行させ、
前記ブロック交換マージは、2つの並び終えたn個(n=1,2,4,8,・・・,N/2)の第1のデータ列とこの第1のデータ列に隣接するn個の第2のデータ列とについて、前記第1のデータ列のm番目(mは1以上n以下の整数)のデータと前記第2のデータ列の1番目のデータとを大小比較し、前記第2のデータ列の1番目のデータの方が小さいときに、前記第1のデータ列のm番目以降の{n−(m−1)}個のデータと前記第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理を、m=1からm=nまで順次行う処理であることを特徴とするデータソートプログラム。 - CPUと記憶装置とを備えたコンピュータをデータソート装置として機能させ、N個(N=2kの整数で、kは1以上の整数)のデータのソートを行うデータソートプログラムにおいて、
2データ、4データ、8データ、・・・、Nデータの並び替えを再帰的にツリー構造で行うマージソートで2つの並び終えたデータ列に対してマージする処理を、ブロック交換マージで行うステップと、
第2のデータ列に対して再度再帰的なマージソートを実施して全体を並び替えるステップとを、前記記憶装置に記憶されたプログラムに従って前記CPUに実行させ、
前記ブロック交換マージは、2つの並び終えたn個(n=1,2,4,8,・・・,N/2)の第1のデータ列とこの第1のデータ列に隣接するn個の第2のデータ列とについて、前記第1のデータ列のm番目(mは1以上n以下の整数)のデータと前記第2のデータ列の1番目のデータとを大小比較し、前記第2のデータ列の1番目のデータの方が大きいときに、前記第1のデータ列のm番目以降の{n−(m−1)}個のデータと前記第2のデータ列の1番目以降の{n−(m−1)}個のデータとをブロック交換する処理を、m=1からm=nまで順次行う処理であることを特徴とするデータソートプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2014228662A JP2016091488A (ja) | 2014-11-11 | 2014-11-11 | データソート方法およびプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2014228662A JP2016091488A (ja) | 2014-11-11 | 2014-11-11 | データソート方法およびプログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2016091488A true JP2016091488A (ja) | 2016-05-23 |
Family
ID=56016276
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2014228662A Pending JP2016091488A (ja) | 2014-11-11 | 2014-11-11 | データソート方法およびプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2016091488A (ja) |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10372451B2 (en) | 2017-05-25 | 2019-08-06 | Samsung Electronics Co., Ltd. | Sequence alignment method of vector processor |
US10409593B2 (en) | 2017-03-31 | 2019-09-10 | Samsung Electronics Co., Ltd. | Semiconductor device |
US10649771B2 (en) | 2017-03-31 | 2020-05-12 | Samsung Electronics Co., Ltd. | Semiconductor device |
-
2014
- 2014-11-11 JP JP2014228662A patent/JP2016091488A/ja active Pending
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10409593B2 (en) | 2017-03-31 | 2019-09-10 | Samsung Electronics Co., Ltd. | Semiconductor device |
US10649771B2 (en) | 2017-03-31 | 2020-05-12 | Samsung Electronics Co., Ltd. | Semiconductor device |
US10990388B2 (en) | 2017-03-31 | 2021-04-27 | Samsung Electronics Co., Ltd. | Semiconductor device |
US11645072B2 (en) | 2017-03-31 | 2023-05-09 | Samsung Electronics Co., Ltd. | Semiconductor device |
US10372451B2 (en) | 2017-05-25 | 2019-08-06 | Samsung Electronics Co., Ltd. | Sequence alignment method of vector processor |
US11068265B2 (en) | 2017-05-25 | 2021-07-20 | Samsung Electronics Co., Ltd. | Sequence alignment method of vector processor |
US11442728B2 (en) | 2017-05-25 | 2022-09-13 | Samsung Electronics Co., Ltd. | Sequence alignment method of vector processor |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP6726246B2 (ja) | 畳み込みニューラルネットワークにおいて演算を実行する方法および装置並びに非一時的な記憶媒体 | |
JP6736646B2 (ja) | 畳み込みニューラルネットワークにおいて畳み込み演算を実行する装置および方法 | |
WO2019128475A1 (zh) | 数据训练方法及装置、存储介质、电子装置 | |
US11734554B2 (en) | Pooling processing method and system applied to convolutional neural network | |
JP6380952B2 (ja) | 多数の要素からなる配列をソートする装置、方法およびプログラム | |
CN108073687B (zh) | 随机游走、基于集群的随机游走方法、装置以及设备 | |
TW201901437A (zh) | 在使用加法器之多維張量中存取資料 | |
US9965343B2 (en) | System and method for determining concurrency factors for dispatch size of parallel processor kernels | |
WO2016006071A1 (ja) | 半導体装置及び情報処理システム | |
JP2016091488A (ja) | データソート方法およびプログラム | |
JP6907700B2 (ja) | 情報処理装置、マルチスレッド行列演算方法、およびマルチスレッド行列演算プログラム | |
KR102574449B1 (ko) | 데이터 처리 방법 및 장치 | |
Dalkilic et al. | A simple shuffle-based stable in-place merge algorithm | |
CN104156268B (zh) | 一种GPU上MapReduce的负载分配和线程结构优化方法 | |
JP2013156696A (ja) | クラスタリング装置及び方法及びプログラム | |
US20130173647A1 (en) | String matching device based on multi-core processor and string matching method thereof | |
KR102142767B1 (ko) | 데이터간 상대적 거리 비율 및 클러스터의 중심 데이터 간의 거리를 고려한 데이터 클러스터링 방법 및 시스템 | |
CN106844601B (zh) | 一种数据存储方法及数据存储装置 | |
JP2009199439A (ja) | マージソート処理方法、マージソート処理装置、及びマージソート処理プログラム | |
CN112711588A (zh) | 多表连接的方法和装置 | |
KR101473955B1 (ko) | Qr분해 연산 방법 및 기록매체 | |
WO2016201822A1 (zh) | 一种数据重排方法、装置及存储介质 | |
JP5874155B2 (ja) | 粒子の接触判定計算方法、粒子の接触判定計算装置、及びコンピュータプログラム | |
CN111506670B (zh) | 一种数据处理方法、装置及设备 | |
JP2018132899A (ja) | 格納方法、格納装置および格納プログラム |