Table de hachage et IO

Table de hachage et IO

Table de hachage (également appelée table de hachage)

Adressage direct

  • Prenez le mot-clé ou une valeur de fonction linéaire du mot-clé comme adresse de hachage. Autrement dit, H (clé) = clé ou H (clé) = a · clé + b, où a et b sont des constantes (cette fonction de hachage est appelée sa propre fonction). S'il y a déjà une valeur dans H (clé), passez à la suivante jusqu'à ce qu'il n'y ait pas de valeur dans H (clé), puis insérez-la.

Analyse numérique

  • Analysez un ensemble de données, comme la date de naissance d'un groupe d'employés. À ce stade, nous constatons que les premiers chiffres de la date de naissance sont à peu près les mêmes. Dans ce cas, la probabilité de conflit sera très élevée, mais nous constatons que la date de naissance Les derniers chiffres indiquant le mois et la date spécifique sont très différents. Si les chiffres suivants sont utilisés pour former une adresse de hachage, la probabilité de conflit sera considérablement réduite. Par conséquent, la méthode d'analyse numérique consiste à découvrir les lois des nombres et à utiliser ces données autant que possible pour construire une adresse de hachage avec une probabilité de conflit plus faible.

Méthode de prise carrée

  • Lorsqu'il est impossible de déterminer quels bits du mot-clé sont répartis plus uniformément, vous pouvez d'abord trouver la valeur carrée du mot-clé, puis prendre les bits du milieu de la valeur carrée comme adresse de hachage si nécessaire. C'est parce que: les bits du milieu après le carré sont liés à chacun des mots-clés, donc différents mots-clés généreront des adresses de hachage différentes avec une probabilité plus élevée.

Méthode de pliage

  • Divisez le mot-clé en plusieurs parties avec le même nombre de bits, et la dernière partie du nombre de bits peut être différente, puis prenez la superposition et (supprimez le report) de ces parties comme adresse de hachage. La superposition numérique peut avoir deux méthodes: la superposition par décalage et la superposition des limites. La superposition de décalage consiste à aligner le bit le plus bas de chaque partie après la division, puis à ajouter; la superposition de limite consiste à se replier le long de la limite de division d'une extrémité à l'autre, puis à aligner et à ajouter.

Méthode des nombres aléatoires

  • Choisissez une fonction aléatoire et prenez la valeur aléatoire de la clé comme adresse de hachage, c'est-à-dire H (clé) = aléatoire (clé), où aléatoire est la fonction aléatoire, qui est généralement utilisée lorsque la longueur de la clé n'est pas égale.

Divisez la méthode du reste

  • Le reste obtenu en divisant la clé par un nombre p non supérieur à la longueur m de la table de hachage est l'adresse de hachage. Autrement dit, H (clé) = clé MOD p, p <= m. Non seulement les mots-clés peuvent être modulés directement, mais également après les opérations telles que le pliage et la mise au carré. Le choix de p est très important, on utilise généralement un nombre premier ou M. Si p n'est pas bien choisi, des synonymes sont susceptibles d'être produits.

Méthode de gestion des adresses en double dans la table de hachage

Adressage ouvert

  • Hi = (H (clé) + di) MOD m, i = 1,2, ..., k (k <= m-1), où H (clé) est la fonction de hachage, m est la longueur de la table de hachage et di est l'augmentation La séquence de quantités peut être sélectionnée des trois manières suivantes:

    • 1.1. Di = 1,2,3, ..., m-1, qui est appelé détection linéaire puis hachage;
    • 1.2. Di = 1 2, -1 2,2 2, -2 2, ⑶ 2, ..., ± (k) 2, (k <= m / 2) est appelé la deuxième détection et le nouveau hachage;
    • 1.3. Di = séquence de nombres pseudo-aléatoires, appelée détection pseudo-aléatoire puis hachage.

Rehachage

  • Hi = RHi (clé), i = 1,2, ..., k RHi sont toutes des fonctions de hachage différentes, c'est-à-dire que lorsque les synonymes produisent des conflits d'adresses, calculez l'adresse d'une autre fonction de hachage jusqu'à ce que le conflit ne se produise plus. Cette méthode n'est pas facile Produire du «rassemblement», mais augmenter le temps de calcul.

Adresse de la chaîne

  • C'est ce que fait hashSet en java. Le même hashcode peut correspondre à plusieurs éléments en même temps, et il y a un pointeur entre chaque élément. Connexion unidirectionnelle

Créer une zone de débordement commune

Si la méthode d'adresse de chaîne est utilisée, la liste chaînée est trop longue

je

Java utilise des variables pour stocker des données, utilise des collections pour stocker et gérer plusieurs données, et IO est responsable du transfert de données (transmission).

Core: Choisissez un objet de flux adapté à la scène actuelle et appelez la méthode en fonction du processus correct.

Pour la classe actuelle, considérez deux problèmes, la direction du flux de données et la direction du contenu des données:

  • direction

    • Données de l'extérieur vers la classe courante, appelée entrée: lecture
    • Les données sont transférées de la classe courante vers l'extérieur, appelée sortie: écriture
  • contenu

    • Généralement, il s'agit de données binaires, appelées flux d'octets en octets. Le flux d'octets peut gérer toutes les situations
    • Un cas particulier est que si le contenu des données est composé uniquement de caractères, des flux de caractères peuvent également être utilisés.

Il existe donc quatre types d'objets de flux

Java fournit quatre classes abstraites:

  • Flux d'octets

    • Flux d'entrée
    • OutputStream
  • Flux de caractères

    • Lecteur
    • Écrivain

Toutes les opérations

  • Fonctionnement du disque: fichier
  • Opérations sur octets: InputStream, OutputStream
  • Opération de caractère: lecteur, écrivain
  • Opération d'objet: sérialisable
  • Fonctionnement du réseau: prise
  • Flux tamponné (similaire à Stringbuffer)

Manipulation d'octets de caractères de base

Flux de caractères d'entrée

  • (New String (array, 0, length); prend un tableau de tableau d'octets de 0 à length, puis le convertit en type 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();
        }
    }

Flux de caractères de sortie

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();
        }
    }

Copiez un fichier txt, lisez d'abord puis écrivez

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();

	}

Une copie d'une image, remplaçant le flux de caractères par un flux d'octets

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);
	}

Si vous apportez le contenu de l'annotation, vous pouvez copier la moitié de l'image, tout comme un effet de démonstration

Buffer stream, encapsule certaines fonctions sur la base d'un flux ordinaire, ce qui est facile à utiliser

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 (); vider le tampon

Fonctionnement du disque

  • Opérations sur disque: la classe File représente des fichiers de manière abstraite (ou des dossiers)

  • Obtenir ou définir des attributs de fichier, créer, supprimer, rechercher, renommer

  • créer

  • Il existe deux façons de créer un dossier

    • mkdir (), retourne vrai / faux, exige que tout le répertoire parent existe, s'il n'existe pas, retourne faux et la création échoue
    • mkdirs (), s'il n'existe pas, créez-le complètement
//创建
    public void create() {
        String dirname = "/Users/xutingyu/Documents/Tye/TestFile/abc";
        File f = new File(dirname);
        f.mkdir();

    }
  • effacer:
public void del() {
        String dirname = "/Users/xutingyu/Documents/Tye/TestFile/bcd/efg/hij";
        File f = new File(dirname);
        f.delete();
    }
  • La méthode de suppression de Fichier en Java ne peut supprimer qu'un seul fichier ou un dossier vide. S'il y a quelque chose dans le dossier, il ne peut pas être supprimé.
  • Si vous souhaitez supprimer le dossier et tout son contenu directement, implémentez vous-même la récursivité
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();
    }
  • Renommer:
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("修改失败");
        }
    }

Je suppose que tu aimes

Origine blog.csdn.net/GodfatherTye/article/details/109185286
conseillé
Classement