Maison >développement back-end >Problème PHP >Quel est le principe sous-jacent d'implémentation des tableaux PHP ?
Le principe d'implémentation sous-jacent des tableaux PHP est le suivant : 1. Table de hachage, une structure de données qui mappe différents mots-clés à différentes unités ; 2. Liste chaînée, qui est un type de données composé de différents nœuds de liste chaînée ; 3. Tableau PHP, utilisant la méthode de liaison pour résoudre les conflits de hachage.
1. Table de hachage
La table de hachage, comme son nom l'indique, mappe différents mots-clés A data structure en différentes unités. La méthode de mappage de différents mots-clés à différentes unités est appelée fonction de hachage
Idéalement, après traitement par la fonction de hachage, les mots-clés et les unités correspondront un à un, mais si la valeur du mot-clé est suffisante dans plusieurs ; Dans certains cas, il est facile de mapper plusieurs mots-clés sur la même unité, c'est-à-dire des conflits de hachage
La solution aux conflits de hachage consiste à utiliser soit la méthode de chaînage, soit la méthode d'adressage ouverte
链接法
C'est-à-dire que lorsque différents mots-clés sont mappés à la même unité, utilisez une liste chaînée pour enregistrer ces mots-clés dans la même unité
开放寻址法
C'est c'est-à-dire que lors de l'insertion de données, s'il s'avère qu'il y a des données dans l'unité à laquelle le mot-clé est mappé, cela signifie qu'un conflit s'est produit, puis continuez à rechercher l'unité suivante jusqu'à ce qu'une unité disponible soit trouvée
En raison du schéma d'adressage ouvert, il occupe la position d'autres unités de mappage de mots-clés, de sorte que les mots-clés suivants sont plus susceptibles d'avoir des conflits de hachage et sont donc sujets à une dégradation des performances
2. Liste chaînée
Depuis ce qui précède Après avoir mentionné les listes chaînées, nous parlons ici brièvement des bases des listes chaînées. Les listes chaînées sont divisées en plusieurs types. Les structures de données couramment utilisées incluent : les files d'attente, les piles, les listes chaînées bidirectionnelles, etc.
Une liste chaînée est une structure de données composée de différents nœuds de liste chaînée. Un nœud de liste chaînée se compose généralement d’un élément + un pointeur vers le nœud suivant. La liste doublement chaînée, comme son nom l'indique, est composée d'un pointeur vers le nœud précédent + un élément + un pointeur vers le nœud suivant
Quant au contenu de la structure de données, nous ne nous développerons pas trop .Nous aurons un contenu spécial plus tard.Introduction détaillée à la structure des données
3. Tableau PHP
La façon dont PHP résout les conflits de hachage est d'utiliser la méthode de liaison, donc PHP. les tableaux sont implémentés par des tables de hachage + des listes chaînées , pour être précis, il est implémenté par une table de hachage + une liste doublement chaînée
4. Structure interne - Table de hachage
HashTable结构体主要用来存放哈希表的基本信息 typedef struct _hashtable { uint nTableSize; // hash Bucket的大小,即哈希表的容量,最小为8,以2x增长。 uint nTableMask; // nTableSize-1 , 索引取值的优化 uint nNumOfElements; // hash Bucket中当前存在的元素个数,count()函数会直接返回此值 ulong nNextFreeElement; // 下一个可使用的数字键值 Bucket *pInternalPointer; // 当前遍历的指针(foreach比for快的原因之一) Bucket *pListHead; // 存储整个哈希表的头元素指针 Bucket *pListTail; // 存储整个哈希表的尾元素指针 Bucket **arBuckets; // 存储hash数组 dtor_func_t pDestructor; // 在删除元素时执行的回调函数,用于资源的释放 zend_bool persistent; //指出了Bucket内存分配的方式。如果persisient为TRUE,则使用操作系统本身的内存分配函数为Bucket分配内存,否则使用PHP的内存分配函数。 unsigned char nApplyCount; // 标记当前hash Bucket被递归访问的次数(防止多次递归) zend_bool bApplyProtection;// 标记当前hash桶允许不允许多次访问,不允许时,最多只能递归3次 #if ZEND_DEBUG int inconsistent; #endif } HashTable;
La structure du bucket est utilisée pour sauvegarder les données Contenu spécifique
typedef struct bucket { ulong h; // 对char *key进行hash后的值,或者是用户指定的数字索引值 uint nKeyLength; // hash关键字的长度,如果数组索引为数字,此值为0 void *pData; // 指向value,一般是用户数据的副本,如果是指针数据,则指向pDataPtr void *pDataPtr; // 如果是指针数据,此值会指向真正的value,同时上面pData会指向此值 struct bucket *pListNext; // 指向整个哈希表的该单元的下一个元素 struct bucket *pListLast; // 指向整个哈希表的该单元的上一个元素 struct bucket *pNext; // 指向由于哈希冲突导致存放在同一个单元的链表中的下一个元素 struct bucket *pLast; // 指向由于哈希冲突导致存放在同一个单元的链表中的上一个元素 // 保存当前值所对于的key字符串,这个字段只能定义在最后,实现变长结构体 char arKey[1]; } Bucket;
Recommandations d'apprentissage associées : Programmation PHP de l'entrée à la maîtrise
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!