압축 원주율

압축 원주율
원주율 은 무궁무진 하 다.앞 에 있 는 100 만 분 을 뽑 아서 압축 을 해 보 세 요.
목표:
1. 생 성 된 파일 이 가장 작 습 니 다.
2. 프로그램 은 생 성 된 파일 에 따라 원주율 앞의 100 만 비트 를 출력 할 수 있 습 니 다.
첫 번 째 로 고려 한 것 은 네 개의 인 코딩 을 사용 하면 바이트 마다 두 개의 숫자 를 저장 할 수 있다 는 것 이다.이렇게 하면 반 을 압축 할 수 있다.
원주율 소수점 아래 백만 자리 보기
http://pi.911cha.com/3.1415926.txt
오후 에 코드 를 써 서 데 이 터 를 분석 했다.

package test;

import java.io.InputStream;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
import java.util.Vector;

public class YsYzl {
	
	private static void test01()
	{
		for(int i=0; i<1024; i++)
		{
			String s = Integer.toBinaryString(i);
			int len = s.length();
			for(int j=len; j<10; j++)
			{
				s = '0' + s;
			}
			System.out.println(s + " " + i);
		}
	}
	
	private static void test02()
	{
		for(int i=0; i<256; i++)
		{
			String s = Integer.toBinaryString(i);
			int len = s.length();
			for(int j=len; j<8; j++)
			{
				s = '0' + s;
			}
			System.out.println(s + " " + i);
		}
	}
	
	/**
	 *          
	 * @throws Exception
	 */
	private static void getYzl() throws Exception
	{
		long begin = System.currentTimeMillis();
		//System.out.println(System.currentTimeMillis());
		InputStream is = YsYzl.class.getResourceAsStream("yzl.txt");
		int buf = 0;
		StringBuffer sb = new StringBuffer(); 
		while(true)
		{
			buf = is.read();
			if(buf==-1)
			{
				break;
			}
			if(buf!=13 && buf!=10)
			{
				sb.append((char)buf);
			}
		}
		sYzl = sb.toString();
		is.close();
		System.out.println(System.currentTimeMillis()-begin);
	}
	
	/**
	 *       。
	 */
	private static void print()
	{
		System.out.println(sYzl.length());
		//System.out.println(sYzl); //             
		for(int i=0; i<10000; i++)
		//for(int i=0; i<10; i++)
		{
			for(int j=0; j<100; j++)
			{
				System.out.print(sYzl.charAt(i*100 + j));
			}
			System.out.println();
		}
	}
	
	private static int doStatistics(String str)
	{
		int count = 0;
		int fromIndex = 0;
		while(true)
		{
			int idx = sYzl.indexOf(str, fromIndex);
			if(idx==-1)
			{
				break;
			}
			count++;
			fromIndex = idx+str.length();
		}
		//System.out.println(str + ":" + count);
		return count;
	}
	
	/**
	 *   ,       
	 *   ,        
000:871
001:973
002:1021
003:989
004:989

	     
1021
  002
989
  003
  004
973
  001
871    
  000
	 */
//	private static void statistics()
//	{
//		int count = 0;
//		String str = "";
//		for(int i=0; i<1000; i++)
//		{
//			if(i<10)
//			{
//				str = "00" + i;
//			}
//			else if(i<100)
//			{
//				str = "0" + i;
//			}
//			else
//			{
//				str = "" + i;
//			}
//			
//			count = doStatistics(str);
//			Vector<String> vct = tmCount.get(count);
//			if(vct==null)
//			{
//				vct = new Vector<String>();
//				tmCount.put(count, vct);
//			}
//			vct.add(str);
//		}
//	}

//	private static void statistics()
//	{
//		int count = 0;
//		String str = "";
//		for(int i=0; i<10000; i++)
//		{
//			if(i<10)
//			{
//				str = "000" + i;
//			}
//			else if(i<100)
//			{
//				str = "00" + i;
//			}
//			else if(i<1000)
//			{
//				str = "0" + i;
//			}
//			else
//			{
//				str = "" + i;
//			}
//			
//			count = doStatistics(str);
//			Vector<String> vct = tmCount.get(count);
//			if(vct==null)
//			{
//				vct = new Vector<String>();
//				tmCount.put(count, vct);
//			}
//			vct.add(str);
//			
////			if((i/100)*100==i)
////			{
////				System.out.println("stat:" + i);
////				//System.out.flush();
////			}
//		}
//		
//		System.out.println(tmCount.lastKey());
//	}

	private static void statistics()
	{
		int count = 0;
		String str = "";
		for(int i=0; i<10; i++)
		{
//			if(i<10)
//			{
//				str = "0" + i;
//			}
//			else
//			{
//				str = "" + i;
//			}
			
			str = "" + i;
			
			count = doStatistics(str);
			Vector<String> vct = tmCount.get(count);
			if(vct==null)
			{
				vct = new Vector<String>();
				tmCount.put(count, vct);
			}
			vct.add(str);
			
//			if((i/100)*100==i)
//			{
//				System.out.println("stat:" + i);
//				//System.out.flush();
//			}
		}
		
		System.out.println(tmCount.lastKey());
	}
	
	
	private static void printCount()
	{
		System.out.println("*************printCount");
		//Set<Integer> set = tmCount.keySet().iterator();
		
		Iterator<Integer> keys = tmCount.keySet().iterator();
		while(keys.hasNext())
		{
			int key = keys.next();
			System.out.print(key + ":");
			Vector<String> vct = tmCount.get(key);
			Iterator<String> values = vct.iterator();
			while(values.hasNext())
			{
				System.out.print(values.next());
				System.out.print(",");
			}
			System.out.println();
		}
	}
	
	public static void main(String[] args) {
		try {
			//test01();
			getYzl();
			//print();
			statistics();
			printCount();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static String sYzl; //     
	public static TreeMap<Integer, Vector<String>> tmCount = new TreeMap<Integer, Vector<String>>();

}


일부 통계 데이터:
통계 숫자 가 나타 난 횟수:
형식:
99548: 6 은 숫자 6 이 99548 번 나 타 났 다 는 것 을 나타 낸다.
매 숫자 출현 횟수
99548:6,
99758:1,
99800:7,
99959:0,
99985:8,
100026:2,
100106:9,
100229:3,
100230:4,
100359:5,
두 자리 의 숫자 가 나타 난 횟수, 앞의 몇 개.
10110:21,
10112:76,
10147:60,
10148:19,
10173:08,
10188:35,
10193:46,
10194:54,
10224:27,
10239:94,
세 자리 의 숫자 가 나타 난 횟수, 앞의 몇 개.
133:0714,6490,
134:0735,5452,
135:0275,6477,
136:7801,
137:3573,
138:4710,9944,
141:3391,
네 자리 숫자 가 나 오 는 횟수, 앞의 몇 개.
1073:244,270,
1075:027,
1076:944,
1077:195,
1078:136,735,
1086:934,
1089:160,453,
1092:654,

좋은 웹페이지 즐겨찾기