해시 테이블 및 IO

해시 테이블 및 IO

해시 테이블 (해시 테이블이라고도 함)

직접 주소 지정

  • 키워드 또는 키워드의 선형 함수 값을 해시 주소로 사용합니다. 즉, H (key) = key 또는 H (key) = a · key + b입니다. 여기서 a와 b는 상수입니다 (이 해시 함수를 자체 함수라고 함). H (key)에 이미 값이 있으면 H (key)에 값이 없을 때까지 다음 값으로 이동 한 다음 입력합니다.

디지털 분석

  • 직원 그룹의 생년월일과 같은 일련의 데이터를 분석합니다. 이때 생년월일의 처음 몇 자리는 거의 동일합니다.이 경우 충돌 가능성이 매우 높지만 생년월일은 월과 특정 날짜를 나타내는 마지막 몇 자릿수는 매우 다르며 다음 자릿수를 사용하여 해시 주소를 구성하면 충돌 가능성이 크게 줄어 듭니다. 따라서 디지털 분석 방법은 숫자의 법칙을 알아 내고 이러한 데이터를 최대한 활용하여 충돌 가능성이 낮은 해시 주소를 구성하는 것입니다.

평방 取中 법

  • 키워드의 어느 비트가 더 균등하게 분포되어 있는지 확인할 수없는 경우 먼저 키워드의 제곱 값을 찾은 다음 필요에 따라 제곱 값의 중간 비트를 해시 주소로 사용할 수 있습니다. 그 이유는 사각형 뒤의 중간 비트가 각 키워드와 관련되어 있으므로 다른 키워드는 더 높은 확률로 다른 해시 주소를 생성합니다.

접는 방법

  • 키워드를 동일한 비트 수를 가진 여러 부분으로 나누면 마지막 부분은 다른 수의 비트를 가질 수 있습니다. 그런 다음 이러한 부분의 중첩을 취하고 (캐리 제거) 해시 주소로 사용합니다. 디지털 중첩에는 시프트 중첩과 경계 중첩의 두 가지 방법이 있습니다. 시프트 중첩은 분할 후 각 부분의 가장 낮은 비트를 정렬 한 다음 추가하는 것입니다. 경계 중첩은 분할 경계를 따라 한쪽 끝에서 다른 쪽 끝으로 앞뒤로 접은 다음 정렬 및 추가하는 것입니다.

난수 방법

  • 임의 함수를 선택하고 키의 임의 값을 해시 주소로 취합니다. 즉, H (key) = random (key)입니다. 여기서 random은 임의의 함수이며 키 길이가 같지 않을 때 일반적으로 사용됩니다.

나머지 방법 나누기

  • 키를 해시 테이블의 길이 m보다 크지 않은 숫자 p로 나눈 나머지가 해시 주소입니다. 즉, H (key) = key MOD p, p <= m입니다. 키워드를 직접 변조 할 수있을뿐만 아니라 접기 및 제곱과 같은 작업 후에도 변조 할 수 있습니다. p의 선택은 매우 중요하며 일반적으로 소수 또는 m이 사용됩니다. p가 잘 선택되지 않으면 동의어가 생성 될 가능성이 높습니다.

해시 테이블에서 중복 주소 처리 방법

개방 주소 지정

  • Hi = (H (key) + di) MOD m, i = 1,2, ..., k (k <= m-1), 여기서 H (key)는 해시 함수, m은 해시 테이블의 길이, di는 증가입니다. 수량 순서는 다음 세 가지 방법으로 선택할 수 있습니다.

    • 1.1. di = 1,2,3, ..., m-1, 선형 탐지라고 불리는 다음 해싱;
    • 1.2. di = 1 2, -1 2,2 2, -2 2, ⑶ 2, ..., ± (k) 2, (k <= m / 2)는 두 번째 탐지 및 재해 싱이라고합니다.
    • 1.3. di = 의사 난수 탐지 및 해싱이라고하는 의사 난수 시퀀스.

재해 싱

  • Hi = RHi (key), i = 1,2, ..., k RHi는 모두 다른 해시 함수입니다. 즉, 동의어가 주소 충돌을 일으킬 때 충돌이 더 이상 발생하지 않을 때까지 다른 해시 함수의 주소를 계산합니다.이 방법은 쉽지 않습니다. "수집"을 생성하지만 계산 시간을 늘립니다.

체인 주소

  • 이것이 java에서 hashSet이하는 일입니다. 동일한 해시 코드가 동시에 여러 요소에 대응할 수 있으며 각 요소 사이에 포인터가 있습니다. 단방향 연결

공통 오버플로 영역 만들기

체인 주소 방법을 사용하면 연결 목록이 너무 깁니다.

나는

Java는 변수를 사용하여 데이터를 저장하고 컬렉션을 사용하여 여러 데이터를 저장 및 관리하며 IO는 데이터 전송 (전송)을 담당합니다.

Core : 현재 장면에 적합한 스트림 객체를 선택하고 올바른 프로세스에 따라 메서드를 호출합니다.

현재 클래스의 경우 데이터 흐름 방향과 데이터 콘텐츠 방향이라는 두 가지 문제를 고려하십시오.

  • 방향

    • 외부에서 현재 클래스로의 데이터, 입력 : 읽기
    • 데이터는 현재 클래스에서 외부로 전송되며 출력 : 쓰기
  • 함유량

    • 일반적으로 바이트 스트림이라고하는 바이너리 데이터입니다. 바이트 스트림은 모든 상황을 처리 할 수 ​​있습니다.
    • 특별한 경우는 데이터의 내용이 모두 문자 인 경우 문자 스트림도 사용할 수 있다는 것입니다.

따라서 4 가지 유형의 스트림 객체가 있습니다.

Java는 4 개의 추상 클래스를 제공합니다.

  • 바이트 스트림

    • InputStream
    • OutputStream
  • 캐릭터 스트림

    • 리더
    • 작가

모든 작업

  • 디스크 작업 : 파일
  • 바이트 작업 : InputStream, OutputStream
  • 캐릭터 작업 : 리더, 라이터
  • 개체 작업 : 직렬화 가능
  • 네트워크 작동 : 소켓
  • 버퍼링 된 스트림 (Stringbuffer와 유사)

기본 문자 바이트 조작

입력 문자 스트림

  • (New String (array, 0, length); 0에서 길이로 바이트 배열 배열을 취한 다음 String 유형으로 변환)
public static void main(String[] args) throws Exception {

        try {
            //读取文件
            FileReader reader = new FileReader("/Users/xutingyu/Documents/Tye/TestFile/tye.txt");
            char[] array = new char[10];
            int length = 0;
            while ((length = reader.read(array)) > 0) {
                //将一个字节数组array从0取到length,然后转换成String类型
                System.out.print(new String(array, 0, length));
            }
            reader.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

출력 문자 스트림

public static void main(String[] args) {

        String str = "hudhkhdpidsjfpdsifjildsgjidgdfg\n123123123";

        try {
            FileWriter writer = new FileWriter("/Users/xutingyu/Documents/Tye/TestFile/tye.txt");
            writer.write(str);
            //清空缓冲区
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

txt 파일 복사, 먼저 읽고 쓰기

public static void main(String[] args) throws Exception {

		FileReader reader = new FileReader("/Users/xutingyu/Documents/Tye/TestFile/tye.txt");
		FileWriter writer = new FileWriter("/Users/xutingyu/Documents/Tye/TestFile/tye1.txt");

		char[] array = new char[10];
		int length = 0;
		writer.write("这是复制内容:\n");
		while ((length = reader.read(array)) > 0) {
			writer.write(new String(array, 0, length));
		}
		writer.flush();
		reader.close();
		writer.close();

	}

문자 스트림을 바이트 스트림으로 대체하는 그림의 사본

public static void main(String[] args) throws Exception {

		FileInputStream input = new FileInputStream("/Users/xutingyu/Documents/Tye/TestFile/tye.jpg");
		FileOutputStream out = new FileOutputStream("/Users/xutingyu/Documents/Tye/TestFile/tye1.jpg");

		byte[] array = new byte[1024];
		int times = 0;

		while (input.read(array) > 0) {
			times++;
			out.write(array);
			if (times == 100) {
				break;
			}
		}
		out.flush();
		input.close();
		out.close();
		System.out.println(times);
	}

주석 내용을 가져 오면 데모 효과처럼 사진의 절반을 복사 할 수 있습니다.

버퍼 스트림, 작동하기 쉬운 일반 스트림을 기반으로 일부 기능을 캡슐화합니다.

public static void main(String[] args) throws Exception{
		
		FileReader reader = new FileReader("/Users/xutingyu/Documents/Tye/TestFile/tye.txt");

		BufferedReader br = new BufferedReader(reader);
		String str="";
		while ((str=br.readLine())!=null) {
			System.out.println(str);
		}

		FileWriter writer=new FileWriter("/Users/xutingyu/Documents/Tye/TestFile/tye1.txt");
		BufferedWriter bw=new BufferedWriter(writer);
		bw.write("dkfkjdgnjknfdlkgn");
		bw.newLine();
		bw.write("32422312321");
		bw.flush();
		bw.close();
		writer.close();
		
		
	}
  • flush (); 버퍼 비우기

디스크 작동

  • 디스크 작업 : File 클래스는 추상적 인 방식 (또는 폴더)으로 파일을 나타냅니다.

  • 파일 속성 가져 오기 또는 설정, 생성, 삭제, 찾기, 이름 바꾸기

  • 창조하다

  • 폴더를 만드는 방법에는 두 가지가 있습니다.

    • mkdir ()은 true / false를 반환하고 전체 상위 디렉토리가 존재해야하며 존재하지 않는 경우 false를 반환하며 생성에 실패합니다.
    • mkdirs (), 존재하지 않는 경우 끝까지 작성하십시오.
//创建
    public void create() {
        String dirname = "/Users/xutingyu/Documents/Tye/TestFile/abc";
        File f = new File(dirname);
        f.mkdir();

    }
  • 지우다:
public void del() {
        String dirname = "/Users/xutingyu/Documents/Tye/TestFile/bcd/efg/hij";
        File f = new File(dirname);
        f.delete();
    }
  • Java에서 File의 삭제 방법은 하나의 파일 또는 빈 폴더 만 삭제할 수 있으며, 폴더에 내용이 있으면 삭제할 수 없습니다.
  • 폴더와 모든 내용을 직접 삭제하려면 재귀를 직접 구현하십시오.
public void delAll(File folder) {
        File[] files = folder.listFiles();
        if (files != null) {
            for (File f : files) {
                if (f.isDirectory()) {
                    delAll(f);
                } else {
                    f.delete();
                }
            }
        }
        folder.delete();
    }
  • 이름 변경 :
public void rename() {

        String path = "/Users/xutingyu/Documents/Tye/TestFile/";
        String picName = "abc";
        String newNmae = "bcd";
        File file = new File(path + picName);
        if (file.renameTo(new File(path + newNmae))) {
            System.out.println("修改成功!");
        } else {
            System.out.println("修改失败");
        }
    }

추천

출처blog.csdn.net/GodfatherTye/article/details/109185286