« 日記 |Main| 日記 »

« Javaで破壊的クイックソート | Java | [Jython]Javaで定義されたフィールドを名前の文字列で取得する方法 »

JavaでSuffixArray

書いてしまったので一応載せておきます。勉強用のコードなので入力文字列が巨大になったときにどういう挙動を示すかは考えていません。

import java.util.Iterator;
import java.util.Vector;

public class Test {
	static char[] buffer;
	public static void main(String[] args) {
		String input = "abracadabra$";
		Vector<Integer> vec = new Vector<Integer>(input.length());
		for(int i = 0; i < input.length() - 1; i++){
			vec.add(i);
		}
		buffer = input.toCharArray();
		vec = sort(vec);
		for (Iterator<Integer> iter = vec.iterator(); iter.hasNext();) {
			Integer i = iter.next();
			System.out.println(input.substring(i));
		}
	}

	static boolean compare(Integer i, Integer j){
		int w = 0;
		while(true){
			if(buffer[i + w] < buffer[j + w]){
				return true;
			}else if(buffer[i + w] > buffer[j + w]){
				return false;
			}
			w++;
		}
	}

	static Vector<Integer> sort(Vector<Integer> vec) {
		if(vec.size() < 2){
			return vec;
		}
		Integer pivot = vec.get(0);
		Vector<Integer> less = new Vector<Integer>();
		Vector<Integer> more = new Vector<Integer>();
		
		for(int i = 1; i < vec.size(); i++){
			Integer v = vec.get(i);
			if(compare(v, pivot)){
				less.add(v);
			}else{
				more.add(v);
			}
		}
		Vector<Integer> result;
		result = sort(less);
		result.add(pivot);
		result.addAll(sort(more));
		return result;
	}
}

トラックバック(Trackback)

Trackback URL: http://www.nishiohirokazu.org/mt/mt-tb.cgi/170

ご意見・ご感想をお送りください(フィードバック)

(フィードバックはメールで送信され、基本的に表示されませんが、内容によっては公開させていただくこともございます。ご了承ください。Your comment doesn't appear the page immediately. If the comment has value to other people, it will be put on the page or subsequent entries. Thank you.)

上の情報は、いずれも未記入でかまいません。 All of above questions are optional.