рдореИрдВ php рдХреА рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд╣реИ
$arr = array( $val1, $val2, ..., $valn );
рдЗрд╕ рд╕рд░рдгреА рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
foreach($arr as $k => $v ) {...}
рдФрд░
$n = count( $arr ); for($k = 0; $k < $n; $k++ ) {...}
рдпрд╣ рдХрд╛рдлреА рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджрд┐ рддреЗрдЬ рдирд╣реАрдВ рд╣реИ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдзреАрдорд╛ рдирд╣реАрдВ рд╣реИред
рдЪрд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВред
- рдирд╣реАрдВред рдХреЛрдИ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдирд╣реАрдВред рдХреЗрд╡рд▓ рдХреЛрдб!
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдзреАрдорд╛ рд╣реИ! рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕
C
рдФрд░
C++
рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрдиреБрднрд╡ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рд░рдгреА рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рдПрдХ рд╕рд░рд▓ рд╕реВрдЪрдХ рдСрдлрд╕реЗрдЯ рд╣реИред
рдореИрдВрдиреЗ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЦреЛрдЬрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рд╣рд╛рде рдирд╣реАрдВ рдорд┐рд▓рд╛, рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рдерд╛ред
рддреЛ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ
рдЖрдЗрдП php рдореЗрдВ
рдПрдХ рд╕рд░рдгреА рдХреЗ
рдЖрдВрддрд░рд┐рдХ рднрд╛рдЧ рдХреЛ рджреЗрдЦреЗрдВ ред
рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, Zend рдХреЛрд░ рдореЗрдВ, рдПрдХ рд╕рд░рдгреА рдХреЛ рдХрдИ рдкрд░рд╕реНрдкрд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
Bucket
рд╕рдВрд░рдЪрдирд╛ рд╕рд░рдгреА рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП
"рд╕реВрдЪрдХ" рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ
typedef struct bucket { ulong h;
HashTable
рд╕рдВрд░рдЪрдирд╛ - рдпрд╣ рдЖрдВрддрд░рд┐рдХ рдЕрднреНрдпрд╛рд╡реЗрджрди рдореЗрдВ рд╕реНрд╡рдпрдВ рд╕рд░рдгреА рд╣реИ:
typedef struct _hashtable { uint nTableSize; uint nTableMask; uint nNumOfElements;
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдЬрд╛рдирдХрд╛рд░реА рднреА рдХрд╛рд░рдг рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдПрд░реЗ рдХреЛ рджреЛрдЧреБрдиреА рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдВрджреЗрд╣ рд╕реЗ рдЬреБрдбрд╝реА рд╕реВрдЪрд┐рдпрд╛рдБ рддреНрд╡рд░рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ, рдмрд▓реНрдХрд┐ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд▓рд┐рдП рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкрд╣реБрдБрдЪ рдПрдХ рдзреАрдорд╛ рдСрдкрд░реЗрд╢рди рд╣реИред
рдЖрдЗрдП
рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдЦрд┐рд░рдХрд╛рд░, Zend рдПрдХ рдПрд░реЗ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реЗ рдкреБрдирд░рд╛рд╡реГрддреНрдд рд╣реЛрддрд╛ рд╣реИред
рдпрд╣рд╛рдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЖрдЧреЗ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рд╕рдмрдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдХреЛ рдПрдХ рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рдЕрдЧрд▓реЗ рддрддреНрд╡ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕ рд▓рд┐рдВрдХ рдХреЛ рд╡рд░реНрддрдорд╛рди рдПрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐
рдЗрдВрдбреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рдХреИрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
int zend_hash_index_find(const HashTable *ht, ulong h, void **pData) { uint nIndex; Bucket *p; nIndex = h & ht->nTableMask; p = ht->arBuckets[nIndex]; while (p != NULL) { if ((p->h == h) && (p->nKeyLength == 0)) { *pData = p->pData; return SUCCESS; } p = p->pNext; } return FAILURE; }
рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рд╣реИрдВред
рдореИрдВ рдкрд╛рдардХреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдмреЛрд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдХреИрд╕реЗ
arBuckets
рд╕рд░рдгреА рдХреА
arBuckets
рдХреА
arBuckets
(
C
HashPosition
рд╕реЗ
C
рд╕рд░рдгреА рд╣реИ -
Bucket
рд╕рдВрдХреЗрдд)ред
рдореИрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣рд╛рдБ
arBuckets
рддрд╛рд▓рд┐рдХрд╛
рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╣реИрд╢ рдХрд╛
рднрд╛рдЧ arBuckets
рдЬрдм рддрдХ рдХрд┐ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рди рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
foreach($arr as $i => $v ){...}
рд╕рд░рдгреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддреЗрдЬрд╝реА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдУ (рдПрди) рд╣реИред
for($i = 0; $i < $n; $i++ ){...}
рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред
рдЕрдиреБрдорд╛рдирд┐рдд рд░реВрдк рд╕реЗ, рдкрд┐рдЫрд▓реЗ рдСрдкрд░реЗрд╢рди рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкреНрд░рдЧрддрд┐ n * (n + 1) / 2 рдЕрд░реНрдерд╛рдд рдХреЗ рдпреЛрдЧ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдХреА рдЬрд╛рдПрдЧреАред рдФрд░ рдпрд╣ O (n
2 ) рдХреЗ рдХреНрд░рдо рдХрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдореВрд▓реНрдп рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдкреВрд░реНрдг рд╣реИрд╢ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдЯрд┐рд▓рддрд╛ O (n) рд╕реЗ O (n
2 ) рддрдХ рднрд┐рдиреНрди рд╣реЛрдЧреАред рдФрд░ рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ O (n) рдХреЗ рдХрд░реАрдм рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА, рдореБрдЦреНрдп рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдПрдХ рдЕрдзрд┐рдХ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рдСрдкрд░реЗрд╢рди рд╣реИред
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА (рдпрд╛ рдорд┐рд╢реНрд░рд┐рдд - рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗ рд░реВрдк рдореЗрдВред
рдЙрдкрд░реНрдпреБрдХреНрдд рд╕рднреА рдЙрдирдХреЗ рд▓рд┐рдП рдЗрд╕ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рднреА рд╕рд╣реА рд╣реИрдВ рдХрд┐ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЧрддрд┐
рдФрд╕рддрди 8 (рдЕрдзрд┐рдХрддрдо 16) рдмрд╛рд░ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ