Le contenu de cet article concerne l'exploitation du fichier php - ajoutez des données d'autres fichiers à ce fichier, partagez-le maintenant avec tout le monde, les amis dans le besoin peuvent s'y référer
Code source GitHub
En fait, notre Le programme écrit des réponses basées sur les questions suivantes :
Il y a deux fichiers texte A.txt B.txt
A.txt 30 millions de lignes, l'ID utilisateur est unique, l'ID utilisateur et le nom d'utilisateur sont séparés par des espaces, comme indiqué ci-dessous :
userid username
1 yi
2 er
3 san
… ...
B.txt 30 millions de lignes, l'ID utilisateur est unique, l'ID utilisateur et le nom réel sont séparés par des espaces, comme indiqué ci-dessous :
nom réel de l'ID utilisateur
1 un
2 deux
3 trois
… …
Veuillez écrire un code pour trouver le nom d'utilisateur correspondant à l'ID utilisateur en B. txt dans A.txt et remplissez-le. Accédez à la troisième colonne de B.txt et indiquez la complexité temporelle.
Dans notre programme, les données de ligne des deux fichiers sont en correspondance biunivoque par défaut, c'est-à-dire que la nième ligne de données dans A correspond à la nième ligne de données dans B. Dans ce Ainsi, la complexité temporelle de notre programme est O(n).
Mais en fonctionnement réel, il y aura certainement une situation où les lignes de données des deux fichiers ne seront pas en correspondance biunivoque. Dans ce cas, je n'ai pensé qu'à l'opération la plus simple avec une complexité temporelle. de O(n^2) , je ne sais pas s'il existe un meilleur algorithme pour résoudre ce problème.
Si le fichier est lu et construit dans une structure de données dont la requête est O(1) ou O(logn), la complexité devrait devenir O(n) ou O(nlogn), mais lorsque vous rencontrez un fichier Trop grande, comment gérer la situation lorsque la structure de données construite est trop grande, apprendre de la pratique de l'indexation b-tree de base de données ?
<?php header("content-type:text/html;charset=utf-8"); function decodeLine(string $lineData, string $delimiter = null) { if (is_null($delimiter)) { $delimiter = ' '; } return explode($delimiter, $lineData); } function encodeLine(array $dataList, string $delimiter = null) { if (is_null($delimiter)) { $delimiter = ' '; } return implode($delimiter, $dataList); }$testA = fopen('./TestData/FileOperation/testA.txt', 'r');$testB = fopen('./TestData/FileOperation/testB.txt', 'r+');$tmpFile = tmpfile();//while (($bBuffer = fgets($testB)) != false) { $bList = decodeLine(trim($bBuffer, "\n\r")); $tmpList = $bList; if (($aBuffer = fgets($testA)) != false) { $aList = decodeLine(trim($aBuffer, "\n\r")); if ($aList[0] == $bList[0]) { $strEncoding = mb_detect_encoding($aList[1], ['ASCII', 'UTF-8', 'GB2312']); $resStr = mb_convert_encoding($aList[1], 'UTF-8', $strEncoding); array_push($tmpList, $resStr."\n"); } } fwrite($tmpFile, encodeLine($tmpList)); } rewind($tmpFile); rewind($testB);while (!feof($tmpFile)) { $tmpBuffer = fread($tmpFile, 1024); fwrite($testB, $tmpBuffer); }fclose($tmpFile);fclose($testA);fclose($testB);
Écrivez la réponse à la question :
Il existe deux fichiers texte A.txt B.txt
A.txt 30 millions de lignes, l'ID utilisateur est unique, l'ID utilisateur et le nom d'utilisateur sont séparés par des espaces, comme indiqué ci-dessous :
1 yi yi
2 er
3 san san
… …
B.txt 30 millions de lignes, l'ID utilisateur est unique, l'ID utilisateur et le nom réel sont séparés par des espaces, comme indiqué ci-dessous :
userid RealName
2 deux
3
…
Veuillez écrire un code pour trouver le nom d'utilisateur correspondant à l'ID utilisateur dans b.txt dans A.TXT, remplissez-le en B. La troisième colonne de txt et donne le complexité temporelle.
Dans notre programme, les données de ligne des deux fichiers sont en correspondance biunivoque par défaut, c'est-à-dire que la nième ligne de données dans A correspond à la nième ligne de données dans B. Dans ce Ainsi, la complexité temporelle de notre programme est O(n).
Mais en fonctionnement réel, il y aura certainement une situation où les lignes de données des deux fichiers ne correspondent pas une à une. Dans ce cas, je ne pense qu'à l'opération la plus simple avec une complexité temporelle de O(. n^2), je ne sais pas s'il existe un meilleur algorithme pour résoudre ce problème.
Si le fichier est lu et construit comme une structure de données dont la requête est O(1) ou O(logn), la complexité devrait devenir O(n) ou O(nlogn), mais lorsque vous rencontrez un fichier Trop grande, comment gérer la situation lorsque la structure de données construite est trop grande, apprendre de la pratique de l'index b-tree de base de données
Recommandations associées :<?php header("content-type:text/html;charset=utf-8"); function decodeLine(string $lineData, string $delimiter = null) { if (is_null($delimiter)) { $delimiter = ' '; } return explode($delimiter, $lineData); } function encodeLine(array $dataList, string $delimiter = null) { if (is_null($delimiter)) { $delimiter = ' '; } return implode($delimiter, $dataList); }$testA = fopen('./TestData/FileOperation/testA.txt', 'r');$testB = fopen('./TestData/FileOperation/testB.txt', 'r+');$tmpFile = tmpfile();//while (($bBuffer = fgets($testB)) != false) { $bList = decodeLine(trim($bBuffer, "\n\r")); $tmpList = $bList; if (($aBuffer = fgets($testA)) != false) { $aList = decodeLine(trim($aBuffer, "\n\r")); if ($aList[0] == $bList[0]) { $strEncoding = mb_detect_encoding($aList[1], ['ASCII', 'UTF-8', 'GB2312']); $resStr = mb_convert_encoding($aList[1], 'UTF-8', $strEncoding); array_push($tmpList, $resStr."\n"); } } fwrite($tmpFile, encodeLine($tmpList)); } rewind($tmpFile); rewind($testB);while (!feof($tmpFile)) { $tmpBuffer = fread($tmpFile, 1024); fwrite($testB, $tmpBuffer); }fclose($tmpFile);fclose($testA);fclose($testB);
Fichier patch Partage de code d'implémentation des opérations sur les fichiers PHP
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!