敗者ツリーJava実装
2027 ワード
敗者ツリーは、データ構造の教科書にあり、k個のレコードの最小値/最大値を直接得ることができ、調整された時間の複雑さはlog(k)であるため、多重集計ソートで複数の多重集計セグメントの最小値/最大値の検索を加速させ、集計の速度を向上させることができる.
敗者ツリーのJavaコードは次のとおりです.Resultは、レコードの抽象です.
初期集計セグメントの生成には、ArrayListとCollectionsを用いる.sort()でいいです.これは改良された集計内部ソートアルゴリズムです.私は実験しました.効率が高いです.13個の100万個の文字列のリスト(文字列ごとに約10文字、重複がある)を並べ替え、クアッドコア3.2 GhzCPUのマシン上、シングルスレッドでも10秒しかかからなかった.実は、外部の列の大部分の時間はIO上、特にCPU性能の良いワークステーション、サーバーに費やされた.
敗者ツリーのJavaコードは次のとおりです.Resultは、レコードの抽象です.
/*
* ResultSet.java 0.0.1 2013/04/04
* Copyright(C) 2013 db-iir RUC. All rights reserved.
*/
import java.util.ArrayList;
/**
* This Class implements the loser tree algorithm.
*
* @author Hank Bian ([email protected])
* @version 0.0.1, 2013/04/04
*/
public class LoserTree
{
private int[] tree = null;//
private int size = 0;
private ArrayList<Result> leaves = null;//
public LoserTree(ArrayList<Result> initResults)
{
this.leaves = initResults;
this.size = initResults.size();
this.tree = new int[size];
for (int i = 0; i < size; ++i)
{
tree[i] = -1;
}
for (int i = size - 1; i >= 0; --i)
{
adjust(i);
}
}
public void del(int s)
{
leaves.remove(s);
size--;
tree = new int[size];
for (int i = 0; i < size; ++i)
{
tree[i] = -1;
}
for (int i = size - 1; i >= 0; --i)
{
adjust(i);
}
}
public void add(Result leaf, int s)
{
leaves.set(s, leaf);//
adjust(s);//
}
public Result getLeaf(int i)
{
return leaves.get(i);
}
public int getWinner()
{
return tree[0];
}
private void adjust(int s)
{
// s ( )
int t = (s + size) / 2;// t s
while (t > 0)
{
if (s >= 0
&& (tree[t] == -1 || leaves.get(s).compareTo(
leaves.get(tree[t])) > 0))
{
//
int tmp = s;
s = tree[t];
tree[t] = tmp;
}
t /= 2;
}
tree[0] = s;//
}
}
初期集計セグメントの生成には、ArrayListとCollectionsを用いる.sort()でいいです.これは改良された集計内部ソートアルゴリズムです.私は実験しました.効率が高いです.13個の100万個の文字列のリスト(文字列ごとに約10文字、重複がある)を並べ替え、クアッドコア3.2 GhzCPUのマシン上、シングルスレッドでも10秒しかかからなかった.実は、外部の列の大部分の時間はIO上、特にCPU性能の良いワークステーション、サーバーに費やされた.