PHPã«ã¯ããã¹ãŠã管çããããã®ããŒã¿æ§é ã1ã€ã ããããŸãã
array
-è€éã§æè»ãªãã€ããªããã
list
ãš
linked map
åäœãçµã¿åãã
linked map
ã ããããPHPã¯
å®çšçãªã¢ãããŒããæ¡çšããŠããããããã¹ãŠã«äœ¿çšããŸããçè«çãªæšè«ã§ã¯ãªãå®çšçãªæšè«ã«åºã¥ããŠãåé¡ã解決ããããã®éåžžã«æ£ç¢ºã§å¥å
šãã€çŸå®çãªæ¹æ³ãæäŸããããã§ãã
array
ã¯ãããªããä»äºãããããšãå¯èœã«ããŸããã圌ãã¯ã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã®è¬çŸ©ã§ããã«ã€ããŠãšãŠã話ããŸãã ããããæ®å¿µãªãããè€éãã«ã¯æè»æ§ã䌎ããŸãã
PHPã®ææ°ãªãªãŒã¹ã¯ãã³ãã¥ããã£ã§å€ãã®è奮ãåŒãèµ·ãããŸããã
æ°ããæ©èœã®äœ¿çšãéå§ãã
ããã©ãŒãã³ã¹ã2åã«ãªããŸã§åŸ
ã¡ãããŸããã§ããã ãããçºçããçç±ã®1ã€ã¯ã
array
æ§é ãåèšèšãããããšã§ãã ããããã¢ã¬ã€ã¯äŸç¶ãšããŠããã¹ãŠã«æé©åãããããšããååãé å®ããŠããŸãã äœã«ãæé©åãããŠããªããããã¹ãŠããŸã å®ç§ã§ã¯ãªããæ¹åã®æ©äŒããããŸãã
SPLããŒã¿æ§é ã¯ã©ãã§ããïŒ
æ®å¿µãªãã...圌ãã¯ã²ã©ãã§ãã PHP7以åã¯ããããã¯_some_ã®å©ç¹ãæäŸããŠããŸããããSPLã䜿çšããŠãå®çšçãªæå³ããªããªãããã«ãªããŸããã
ãªãããããä¿®æ£ããŠæ¹åã§ããªãã®ã§ããïŒ
ã¯ããã§ããŸããããããã®èšèšãšå®è£
ã¯éåžžã«è²§åŒ±ãªã®ã§ãããæ°ãã代æ¿åãèŠã€ããæ¹ãè¯ããšæããŸãã
ãSPLããŒã¿æ§é ã¯æãããèšèšãããŠããŸããã
- ã¢ã³ãœããŒã»ãã§ã©ãŒã©
ã¯ããã« ïŒ
php-ds
ã¯ãããŒã¿æ§é ãè¿œå ããPHP7ã®æ¡åŒµæ©èœã§ãã ãã®æçš¿ã§ã¯ãããããã®åäœãããã©ãŒãã³ã¹ãããã³å©ç¹ã«ã€ããŠç°¡åã«èª¬æããŸãã ãŸããæåŸã«ãäºæ³ããã質åã«å¯Ÿããåçã®ãªã¹ãã衚瀺ãããŸãã
Github ïŒ
https :
//github.com/php-dsåå空éïŒ Ds\
ã€ã³ã¿ãŒãã§ãŒã¹ïŒ Collection
ã
Sequence
ã
Hashable
ã¯ã©ã¹ïŒ Vector
ã
Deque
ã
Stack
ã
Queue
ã
PriorityQueue
ã
Map
ã
Set
åé
Collection
ã¯ã
foreach
ã
echo
ã
count
ã
print_r
ã
var_dump
ã
serialize
ã
json_encode
ãããã³
clone
json_encode
äžè¬çãªæ©èœãå«ãåºæ¬çãªã€ã³ã¿ãŒãã§ãŒã¹ã§ãã
ã·ãŒã±ã³ã¹
Sequence
ã¯ãåäžã®ç·åœ¢æ¬¡å
ã«ç·šæãããèŠçŽ ã®åäœãèšè¿°ããŸãã äžéšã®èšèªã§ã¯ããã®ãããªæ§é ã¯
List
ãšåŒã°ããŸãã äžéšã®æ©èœãé€ããŠãå¢åããŒã䜿çšãã
array
䌌ãŠããŸãïŒ
- å€ã¯åžžã«
[0, 1, 2, âŠ, size - 1]
ãšããŠã€ã³ããã¯ã¹ä»ãããå¿
èŠããããŸã - ååŸãŸãã¯è¿œå ã«ãããé£ç¶ãããã¹ãŠã®å€ã®ã€ã³ããã¯ã¹ãæŽæ°ãããŸã
- ã€ã³ããã¯ã¹
[0, size - 1]
ããã®ã¿å€ãžã®ã¢ã¯ã»ã¹ããµããŒãããŸã
ãŠãŒã¹ã±ãŒã¹
array
ããªã¹ããšããŠäœ¿çšãããå ŽæïŒããŒãªãïŒSplDoublyLinkedList
ããã³SplFixedArray
ããå¹ççãªä»£æ¿æ段
ãã¯ãã«
Vector
ã¯ãå€ãé£ç¶ãããã¡ãŒã«çµåããèªåçã«å¢æžãã
Sequence
ã§ãã ããã¯æãå¹ççãªã·ãŒã±ã³ã·ã£ã«ããŒã¿æ§é ã§ããèŠçŽ ã®ã€ã³ããã¯ã¹ã¯ãããã¡å
ã®ã€ã³ããã¯ã¹ã®çŽæ¥çãªåæ ã§ããããã¯ãã«ãå¢ãããŠãããã©ãŒãã³ã¹ã«ã¯åœ±é¿ããŸããã
匷ã¿
- éåžžã«äœãã¡ã¢ãªæ¶è²»
- éåžžã«é«éãªå埩
get
ã set
ã push
ãããã³pop
è€é床ã¯O(1)
æ¬ ç¹
insert
ã remove
ã shift
ãããã³unshift
è€é床ã¯O(n)
Photoshopã®äžçªã®æ§é ã¯ãã¯ã¿ãŒã§ããã
- ã·ã§ãŒã³ã»ãã¢ã¬ã³ã ã CppCon 2015
Deque ïŒäºéæ¥ç¶ãã¥ãŒïŒ
Deque
ïŒããããããšçºé³ïŒã¯ãäžé£ã®å€ãé£ç¶ãããã¡ãŒã«çµåãããã®ã§ãèªåçã«å¢æžããŸãã ååã¯ã
䞡端ãã¥ãŒã®äžè¬çãªç¥èªã§ãã
Ds\Queue
å
ã§äœ¿çšãããŸãã
2ã€ã®ãã€ã³ã¿ãŒã䜿çšããŠãé ãšå°Ÿã远跡ããŸãã ãã€ã³ã¿ãŒããããšãä»ã®èŠçŽ ã移åããŠã¹ããŒã¹ã解æŸããããšãªãããããã¡ãŒã®çµãããšå§ãŸããå€æŽã§ããŸãã ããã«ããã
shift
ãš
shift
unshift
éåžžã«é«éã«ãªãã
Vector
ã§ãã競åã§ããªããªããŸãã
ã€ã³ããã¯ã¹ã«ãã£ãŠå€ã«ã¢ã¯ã»ã¹ããã«ã¯ããããã¡ãŒå
ã®å¯Ÿå¿ããäœçœ®ãèšç®ããå¿
èŠããããŸãïŒ
((head + position) % capacity)
ã
匷ã¿
- éåžžã«äœãã¡ã¢ãªæ¶è²»
get
ã set
ã push
ã pop
ã shift
ãããã³unshift
è€é床ã¯O(1)
æ¬ ç¹
insert
ã remove
ã¯O(n)
è€éããæã¡ãŸã- ãããã¡ãŒå®¹éã«ã¯2ã®
2â¿
ïŒ 2â¿
ïŒãå¿
èŠã§ã
次ã®ãã³ãããŒã¯ã¯ã
push
2â¿ä¹±æ°æäœã«äœ¿çšãããåèšçµéæéãšã¡ã¢ãªã瀺ããŠããŸãã
array
ã
Ds\Vector
ããã³
Ds\Deque
è¿
éã«
SplDoublyLinkedList
ããŸããã
SplDoublyLinkedList
ã¯çµæã
2å以äžå®å®ããŠè¡šç€ºããŸãã
SplDoublyLinkedList
ã¯åå€ã«ã¡ã¢ãªã
SplDoublyLinkedList
å²ãåœãŠããããã¡ã¢ãªã®äºæ³ãããå¢å ãçºçããŸãã
array
ããã³
Ds\Deque
ããã®å®è£
ã«ãããŠãã¡ã¢ãªãéšåçã«å²ãåœãŠãŠ2èŠçŽ ã®ååãªããªã¥ãŒã ãç¶æããŸãã
Ds\Vector
ã®æé·å åã¯1.5ã§ãããããã«ããã¡ã¢ãªå²ãåœãŠæ°ãå¢å ããŸãããäžè¬çã«ã¯æ¶è²»éãå°ãªããªããŸãã


次ã®ãã³ãããŒã¯ã¯ã2â¿ã®å€ã®ã·ãŒã±ã³ã¹ã§
åäžã®èŠçŽ ã®ã·ããã解é€ããã®ã«ãããæéã瀺ããŠããŸãã å€ã®èšå®ã«å¿
èŠãªæéã¯èæ
®ãããŸããã
ã°ã©ãã¯ã
array_unshift
è€éãã
O(n)
ããããšã瀺ããŠããŸãããµã³ãã«ãµã€ãºã2åã«ãªããšã
unshift
å¿
èŠãªæé
unshift
ãŸãã ããã¯ãç¯å²
[1, size - 1]
åæ°å€ã¡ããªãã¯ãæŽæ°ããå¿
èŠãããããã§ãã

ãããã
Ds\Vector::unshift
O(n)
ã§ãããã®ã§ããªããããªã«éãã®ã§ããïŒ
array
ã¯ãããŒãšããã·ã¥ãšãšãã«åå€ã
bucket
ã«ä¿åããããšã«æ³šæããŠãã ããã ãããã£ãŠãã€ã³ããã¯ã¹ãæ°å€ã®å ŽåãåèŠçŽ ããã§ãã¯ããŠããã·ã¥ãæŽæ°ããå¿
èŠããããŸãã å®éã
array_unshift
ã¯ããã«æ°ããé
åãå²ãåœãŠããã¹ãŠã®å€ãã³ããŒããããšå€ãé
åã眮ãæããŸãã
ãã¯ãã«ã§ã¯ãå€ã®ã€ã³ããã¯ã¹ã¯ãããã¡å
ã®ã€ã³ããã¯ã¹ã®çŽæ¥è¡šç€ºãªã®ã§ã[1ããµã€ãº-1]ã®ç¯å²ã®åå€ã1ããžã·ã§ã³åå³ã«ç§»åããã ãã§ãã ããã¯ã1ã€ã®
memmove
æäœã§å®è¡ãããŸãã
Ds\Deque
ããã³
SplDoublyLinkedList
ã¯éåžžã«é«éã§ããããã¯ãå€ã®
SplDoublyLinkedList
ã®æéããµã³ãã«ãµã€ãºã®åœ±é¿ãåããªããã
unshift
ã ãã®è€éãã¯
O(1)
ãŸãã
次ã®ãã¹ãã§ã¯ã2ã€ã³ãã®
pop
æäœã«äœ¿çšãããã¡ã¢ãªéã瀺ããŸãã ã€ãŸãã2â¿ãããŒãã«ãµã€ãºå€æŽããå Žå
ããã§èå³æ·±ãã®ã¯ããµã€ãºã倧å¹
ã«çž®å°ãããå Žåã§ãã
array
åžžã«å²ãåœãŠãããã¡ã¢ãªãä¿æããããšã§ãã
Ds\Vector
ããã³
Ds\Deque
ã¯ããµã€ãºãçŸåšã®æœåšèœåã®4åã®1ãäžåããš
Ds\Deque
å²ãåœãŠããããªãœãŒã¹ã
Ds\Deque
ã§ããŸãã
SplDoublyLinkedList
ã¯ããµã³ãã«ããåé€ãããã³ã«ã¡ã¢ãªã解æŸãããããçŽç·çãªæžå°ã芳å¯ã§ããŸãã

ã¹ã¿ãã¯
ã¹ã¿ãã¯ã¯ãæ§é ã®æäžäœã®å€ã®ã¿ã«ã¢ã¯ã»ã¹ã§ãã
ãåŸå
¥ãå
åºãããŸãã¯
ãLIFOïŒåŸå
¥ãå
åºãïŒãã®ååã«åºã¥ããŠç·šæãããã³ã¬ã¯ã·ã§ã³ã§ãã ããªãã¯ãããåçèœåãæã€
æŠåšå±ãšèããããšãã§ããŸãã
Ds\Stack
ã¯ãå
éšã§
Ds\Vector
䜿çšããŸãã
SplStack
ç¶æ¿ãããããããã©ãŒãã³ã¹ã¯ã以åã®ãã¹ãã§
Ds\Vector
ãš
SplDoublyLinkedList
ãæ¯èŒããå Žåãšåçã«ãªããŸãã 2â¿ã®
pop
æäœãå®è¡ãã2â¿ãããŒãã«ãµã€ãºå€æŽããã®ã«å¿
èŠãªæéãèŠãŠã¿ãŸãããã

ãã¥ãŒ
ãã¥ãŒã¯ãèŠçŽ ãžã®ã¢ã¯ã»ã¹ã®ãã©ãã€ã
ãå
çé ã ïŒãFIFOãããå
å
¥ãå
åºãã ïŒãæã€ããŒã¿åã§ãã ãã®ã³ã¬ã¯ã·ã§ã³ã䜿çšãããšãè¿œå ãããé åºã§èŠçŽ ã«ã¢ã¯ã»ã¹ã§ããŸãã ãã®ååã¯ããèªäœãç©èªã£ãŠããŸããåºã®ã¬ãžã§äžŠãã§ãã人ã
ã®åãšããŠæ§é ãæ³åããŠãã ããã
Ds\Queue
ã¯ã
Ds\Deque
䜿çšããŸãã
SplQueue
ããç¶æ¿ããããããããã©ãŒãã³ã¹ã¯ãåã®ãã³ãããŒã¯ã§ç€ºãã
Ds\Deque
ãš
SplDoublyLinkedList
ãæ¯èŒããããšãšåçã§ãã
PriorityQueue ïŒãã©ã€ãªãªãã£ãã¥ãŒïŒ
ãã©ã€ãªãªãã£ãã¥ãŒã¯ãã·ã³ãã«ãã¥ãŒã«éåžžã«ãã䌌ãŠããŸãã ã¢ã€ãã ã¯æå®ãããåªå
床ã§ãã¥ãŒã«å
¥ããããæãåªå
床ã®é«ãå€ãåžžã«æåé¢ã«ãªããŸãã åªå
床ãã¥ãŒã®çŽæ¥åæã¯éåžžã«ç Žå£çã§ããã
pop
æäœã®é 次åŒã³åºãã§ãããããã¯éåžžã«é«äŸ¡ãªæäœã§ãã
åªå
床ãã¥ãŒã®å®è£
ã¯
max-heapã䜿çšã
ãŸã ã
ãå
çé ãã®ååã¯ãåãåªå
床ã®å€ã«å¯ŸããŠç¶æããããããåãåªå
床ã®å€ã®ã°ã«ãŒãã¯éåžžã®ãã¥ãŒãšèŠãªãããšãã§ããŸãã
ããã©ãŒãã³ã¹ã¯ã©ãã§ããïŒ æ¬¡ã®ãã³ãããŒã¯ã¯ããã¥ãŒå
ã®ã©ã³ãã ãªåªå
床ã§
push
2â¿ä¹±æ°æäœã«å¿
èŠãªæéãšã¡ã¢ãªã瀺ããŠããŸãã åãã¹ãã«åãä¹±æ°ã䜿çšãããŸãã
Queue
ãã¹ãã¯ã©ã³ãã ãªåªå
床ãçæããŸããã䜿çšãããŸããã
ããã¯ãããããã¹ãŠã®ãã³ãããŒã¯ã®äžã§æãéèŠã§ãã
Ds\PriorityQueue
ã¯
SplPriorityQueue
2å以äžã®é床ã§ãããã¡ã¢ãªã®
5ïŒ
ãã䜿çšããŸãããããã¯
20åã®å¹ççãªã¡ã¢ãªãœãªã¥ãŒã·ã§ã³ã§ãã
ããããã©ã®ããã«ïŒ
SplPriorityQueue
ãåæ§ã®å
éšæ§é ã䜿çšããŠããå Žåãã©ãããŠãã®ãããªå€§ããªéã
SplPriorityQueue
ã§ããããïŒ ãã¹ãŠã¯ãå€ãåªå
床ãšã©ã®ããã«ãã¢ãªã³ã°ããããã«ããã£ãŠããŸãã
SplPriorityQueue
ã䜿çšãããšãå€æ°ãšããŠäœ¿çšããããã«ä»»æã®ã¿ã€ãã®å€ã䜿çšã§ããŸããããã«ãããåãã¢ã®åªå
é äœã
32ãã€ãã§ãããšããäºå®ã«ã€ãªãã
ãŸã ã
Ds\PriorityQueue
ã¯æŽæ°ã®åªå
Ds\PriorityQueue
ã®ã¿ããµããŒããããããåãã¢ã«
24ãã€ããå²ãåœãŠãã
ãŸã ã ããããããã¯ãŸã çµæã説æããã®ã«ååãªéãã§ã¯ãããŸããã
SplPriorityQueue::insert
ãœãŒã¹ã³ãŒããèŠããš
ãå€ãšåªå
é äœã®ãã¢ã
æ ŒçŽãã ããã«é
åã
åæåãããŠããããšã
SplPriorityQueue::insert
ãŸãã
ãªããªã é
åã®æå°å®¹éã¯8
zval + HashTable + 8 * (Bucket + hash) + 2 * zend_string + (8 + 16) byte string payloads
ãåãã¢
zval + HashTable + 8 * (Bucket + hash) + 2 * zend_string + (8 + 16) byte string payloads
= 16 + 56 + 36 * 8 + 2 * 24 + 8 + 16
ãå®éã«å²ãåœãŠãããŸã
16 + 56 + 36 * 8 + 2 * 24 + 8 + 16
= 432ãã€ã ïŒ64ãããïŒã
ãããã§...ãªãã¢ã¬ã€ãªã®ïŒã
SplPriorityQueue
ã¯åãå
éš
SplMaxHeap
æ§é ã䜿çšããŸããããã«ã¯ãå€ã
zval
ã¿ã€ãã§ããå¿
èŠããããŸãã 次ã®ããã«ã
zval
ãã¢ãäœæããæçœãªïŒãããéå¹ççãªïŒæ¹æ³
zval
èªäœã¯
array
ãšããŠäœ¿çšãããŸãã


ããã·ã¥å¯èœ
ãªããžã§ã¯ãã
ããŒãšããŠäœ¿çšã§ããããã«ããã€ã³ã¿ãŒãã§ã€ã¹ã ããã¯ã
handle:
åºã¥ããŠããã·ã¥å
ã®ãªããžã§ã¯ãã決å®ãã
spl_object_hash
ã®ä»£æ¿ã§ã
handle:
ããã¯ãæ¯èŒæã«çãããšèŠãªããã2ã€ã®ãªããžã§ã¯ããçããããã·ã¥ãæããªãããšãæå³ããŸãã ãããã¯åãã€ã³ã¹ã¿ã³ã¹ã§ã¯ãããŸããã
Hashable
ã¯ã2ã€ã®ã¡ãœããã
hash
ãš
equals
ã®ã¿ãå°å
¥ããŸãã Javaã
hashCode
ããã³
equals
ããŸãã¯Python
___hash___
ããã³
__eq__
ã§ã¯ãä»ã®å€ãã®èšèªãããããã€ãã£ãã«ãµããŒãããŸãã PHPã«åæ§ã®åäœãè¿œå ããRFCãããã€ããããŸããããã©ããåãå
¥ããããŸããã§ããã
æ ŒçŽãããŠãããªããžã§ã¯ãã®ããŒã
Hashable
ãå®è£
ããŠããªãå Žåããã¹ãŠã®æ§é ã¯
spl_object_hash
ãè¿ããŸãã
Hashable
ããŒã¿
Hashable
ïŒ
Map
ããã³
Set
ã
ãããïŒé£æ³é
åïŒ
Map
ã¯ãé¡äŒŒããã³ã³ããã¹ãã®
array
ãšã»ãŒåäžã®ããŒãšå€ã®ãã¢ã®é 次ã³ã¬ã¯ã·ã§ã³ã§ãã
ããŒã¯ã©ã®ã¿ã€ãã§ãããŸããŸããããå¯äžã®æ¡ä»¶ã¯äžææ§ã§ãã ããŒãå床远å ãããšãå€ã眮ãæããããŸãã
array
åæ§ãæ¿å
¥é åºã¯ä¿æãããŸãã
匷ã¿
- ããã©ãŒãã³ã¹ãšã¡ã¢ãªå¹çã¯
array
ã»ãŒåãã§ã - ããŠã³ãµã€ãºæã«èªåçã«ã¡ã¢ãªã解æŸããŸã
- ããŒãšå€ã¯ããªããžã§ã¯ããå«ãä»»æã®ã¿ã€ãã«ããããšãã§ããŸã
Hashable
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãããªããžã§ã¯ãã®åŠçããµããŒãããŸãput
ã get
ã remove
ã containsKey
è€é床ã¯O(1)
æ¬ ç¹
- ãªããžã§ã¯ãããŒãããå Žåã
array
ã«å€æã§ããŸãã - ã€ã³ããã¯ã¹ïŒäœçœ®ïŒã§å€ã«ã¢ã¯ã»ã¹ããæ¹æ³ã¯ãããŸãã
次ã®ãã³ãããŒã¯ã¯ã
array
ãš
Ds\Map
ã®ããã©ãŒãã³ã¹ãšã¡ã¢ãªå¹ç
Ds\Map
åãã§ããããšã瀺ããŠããŸãã ãã ãã
Ds\Map
ããµã€ãºãæœåšèœåã®4åã®1ãäžåããšã
array
ã¯åžžã«å²ãåœãŠãããã¡ã¢ãªãä¿æããŸãã


ã»ããïŒå€æ°ïŒ
Set
-
äžæã®å€ã®ã³ã¬ã¯ã·ã§ã³ã ãã¥ãŒããªã¢ã«ã§ã¯ã
Set
æ§é ã§ã¯ãå®è£
ã§ç¹ã«æå®ãããŠããªãéããå€ã¯é åºä»ããããŠããªãããšãããããŸãã JavaãäŸã«ãšããšã
java.util.Set
ã¯
HashSet
ãš
TreeSet
2ã€ã®äž»èŠãªå®è£
ãåããã€ã³ã¿ãŒãã§ãŒã¹ã§ãã
HashSet
ã¯
add
ãš
remove
ã«
O(1)
è€éããæäŸãã
TreeSet
ã¯ãœãŒããããããŒã¿ã»ãããæäŸããŸããã
add
ãš
remove
è€éãã¯
O(log n)
å¢å ã
O(log n)
ã
Set
ã¯ãåãã
array
åºã¥ããŠã
Map
ãšåãå
éšæ§é ã䜿çšããŸãã ããã¯ãå¿
èŠã«å¿ããŠ
Set
ã
O(n * log(n))
ã§ãœãŒãã§ããããšãæå³ããŸãããã以å€ã®å Žåã¯ã
Map
ããã³
array
ãšåããããç°¡åã§ãã
匷ã¿
add
ã remove
ãããã³contains
ã¯O(1)
è€éãããããŸãHashable
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ãããªããžã§ã¯ãã®åŠçããµããŒãããŸã- ä»»æã®ã¿ã€ãã®å€ããµããŒãããŸã ïŒ
SplObjectStorage
ã¯ãªããžã§ã¯ãã®ã¿ããµããŒãããŸãïŒã - ãããããšã®è«çæŒç®ïŒ
intersection
ã difference
ã union
ã exclusive or
ïŒãšåç
æ¬ ç¹
push
ã pop
ã insert
ã shift
ãŸãã¯unshift
ãµããŒãããŠããŸãã- ã€ã³ããã¯ã¹ä»ããŸã§åé€ãããå€ãããå Žåã
get
ã¯O(n)
è€éããæã¡ãããã§ãªãå Žåã¯O(1)
次ã®ãã³ãããŒã¯ã¯ãstdClassã®2ã€ã®æ°ããã€ã³ã¹ã¿ã³ã¹ãè¿œå ããã®ã«ãããæéã瀺ããŠããŸãã
Ds\Set
SplObjectStorage
ããã
ãããã«é«éã§
SplObjectStorage
ã䜿çšããã¡ã¢ãªã
çŽååå°ãªãããšã瀺ããŠããŸãã


äžæã®å€ãæã€é
åãäœæããäžè¬çãªæ¹æ³ã¯
array_unique
ãäžæã®å€ã®ã¿ãå«ãæ°ãã
array
ãäœæããŸãã ãã ã
ãé
åã®
å€ã«ã¯ã€ã³ããã¯ã¹ãä»ããããŠããªãããšã«
in_array
ã¯è€é床
O(n)
ç·åœ¢æ€çŽ¢ã§ãã
array_unique
ã¯ãããŒãé€ãå€ã§ã®ã¿æ©èœããŸããé
åã®å€ã®åãã§ãã¯ã¯ç·åœ¢æ€çŽ¢ã§ãããæéã®
O(n²)
ãšã¡ã¢ãªæ¶è²»ã®
O(n)
ã®åèšã®è€éããæäŸããŸãã

äºæ³ããã質åãšæèŠãžã®åç
ãã¹ãã¯ãããŸããïŒ
çŽ
2600ã®ãã¹ãã«ãªããŸãã ã äžéšã®ãã¹ãã¯åé·ã§ããå¯èœæ§ããããŸããããŸã£ãããã§ãã¯ããªãããããéæ¥çã«åãããšã2åãã¹ããããã§ãã
ããã¥ã¡ã³ãïŒ APIãªãã¡ã¬ã³ã¹ïŒ
ãã®ããã¥ã¡ã³ãã®å·çæç¹ã§ã¯ãå®å
šãªããã¥ã¡ã³ãã¯ãŸã ãããŸããããæåã®å®å®çãªãªãŒã¹ãšå
±ã«è¡šç€ºãããŸãã
ãã ãã
ååã«ææžåãããã¹ã¿ããã¡ã€ã«ãããã€ã
ãããŸã ã
ãã³ãããŒã¯ã®é
眮ã確èªã§ããŸããïŒ ãããã«ã€ããŠäœããããŸããïŒ
ãã¹ãŠã®ãã³ãããŒã¯ã¯ã
2015 Macbook Proã® PHP 7.0.3
æšæºãã«ãã§å®è¡ãããŸããã çµæã¯ãããŒãžã§ã³ãšãã©ãããã©ãŒã ã«ãã£ãŠç°ãªãå ŽåããããŸãã
Stack
ã Queue
ã Set
ããã³Map
ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšãããªãã®ã¯ãªãã§ããïŒ
代æ¿ã®å®è£
ãå¿
èŠã ãšã¯æããªãã 3ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ãš7ã€ã®ã¯ã©ã¹ã¯ããã©ã°ããã£ãºã ãšå°éåã®ãã©ã³ã¹ãåããŠããŸãã
ãã€Vector
代ããã«Deque
ã䜿çšããå¿
èŠããããŸããïŒ
shift
ããã³
unshift
ã䜿çšããªãããšã確å®ã«ããã£ãŠããå Žåã¯ã
Vector
䜿çšããŸãã 䟿å©ãªã¿ã€ãã³ã°ã®ããã«ã
Sequence
ã¿ã€ããšããŠãã³ããæå®ã§ããŸãã
ãã¹ãŠã®ã¯ã©ã¹ãçµäºããã®ã¯ãªãã§ããïŒ
php-ds
APIã®èšèšã§ã¯ã
ãç¶æ¿ãä»ããæ§æããé©çšãããŸãã
SPLæ§é ã¯ãç¶æ¿ã®èª€çšã®è¯ãäŸã§ãã ããšãã°ã
SplStack
ã¯
SplStack
æ¡åŒµã
SplDoublyLinkedList
ãããã¯ãã€ã³ããã¯ã¹ã
shift
ãããã³
shift
SplDoublyLinkedList
ã«ããã©ã³ãã ã¢ã¯ã»ã¹ããµããŒãããããã
SplStack
ã¯
Stackã§ã¯ãããŸããã
Javaã³ã¬ã¯ã·ã§ã³ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãç¶æ¿ã«ãã£ãŠãããŸãããçããèå³æ·±ãã±ãŒã¹ãããã€ããããŸãã
ArrayDeque
ã¯ãèŠçŽ ãè¿œå ããããã®3ã€ã®ã¡ãœããã
add
ã
addLast
ãããã³
push
ãŸãã ããã¯æªããªãããªããªã
ArrayDeque
ã¯ã
Deque
ãš
Queue
å®è£
ããŸããããã¯ã
addLast
ãš
push
åæã«ååšããããšã説æããŠããŸãã ãã ããåãããšãäžåºŠã«è¡ã3ã€ã®æ¹æ³ã¯ãã¹ãŠãæ··ä¹±ãšççŸãåŒãèµ·ãããŸãã
å€ã
java.util.Stack
æ¡åŒµãããããã
Deque
ã€ã³ã¿ãŒãã§ãŒã¹ãšãã®å®è£
ã«ãããããå®å
šã§äžè²«ããLIFOæäœã®ã»ãããæäŸãããŸãããã
Deque
ã¯
addFirst
ãš
remove(x)
ã¡ãœãããå«ãŸããŠããŸãã APIã«ãã
stack
æ§é ã®äžéšã§ããã
ãããã®æ§é ãã°ãã°ãã®ã¡ãœãããæã£ãŠãããããšãã£ãŠããããã§ããªããšããããã§ã¯ãããŸããã
å®éãããã¯å
¬å¹³ãªãã€ã³ãã§ãããããŒã¿æ§é ã®æ§ç¯ã«ã¯åæãããé©ããŠãããšèããŠããŸãã
array
ããã«ããããã¯èªçµŠèªè¶³ããããšãç®çãšããŠããŸãã
array
ããç¶æ¿ããããšã¯ã§ããŸãããå®éã®ããŒã¿ãä¿åããããã ãã«äœ¿çšããŠãç¬èªã®APIãéçºããå¿
èŠããããŸãã
ç¶æ¿ã¯ãŸããå
éšå®è£
ã«ãããŠäžå¿
èŠãªå°é£ãåŒãèµ·ãããŸãã
ã°ããŒãã«åå空éã«ds
ã¯ã©ã¹ãå¿
èŠãªã®ã¯ãªãã§ããïŒ
代æ¿æ§æãæäŸããŸãã

ãªã³ã¯ãªã¹ãããªãã®ã¯ãªãã§ããïŒ
LinkedList
ã¯ã©ã¹ã¯å®éã«æåã«ç»å Žããè¯ãã¹ã¿ãŒãã®ããã«æããŸããã ããããçµå±ãç§ã¯åœŒãã©ããªç¶æ³ã§ã
Vector
ã
Deque
ã«å¯Ÿæã§ããªãããšã«æ°ä»ãããšãããããåé€ããããšã«ããŸããã å¯èœãªãµããŒãã®2ã€ã®äž»ãªçç±
ã¯ãªãŒããŒãããåé
ãš
ãªã³ã¯å±ææ§ã§ã ã
ãªã³ã¯ãªã¹ãã§ã¯ãå€ãè¿œå ãŸãã¯åé€ããããã³ã«ãæ§é èŠçŽ
ïŒããŒãïŒã®äºçŽã¡ã¢ãªãè¿œå ãŸãã¯åé€ããŸãã ããŒãã«ã¯ãåã®ããŒããšæ¬¡ã®ããŒããåç
§ããããã®2ã€ã®ãã€ã³ã¿ãŒãå«ãŸããŠããŸãïŒäºéãªã³ã¯ãªã¹ãã®å ŽåïŒã
Vector
ãš
Deque
äž¡æ¹ã®æ§é äœã¯ãäºåã«ã¡ã¢ãªãããã¡ãå²ãåœãŠãããããããé »ç¹ã«è¡ãå¿
èŠã¯ãããŸããã ãŸããåã®å€ãšåŸã®å€ãç¥ãããã«è¿œå ã®ãã€ã³ã¿ãŒãå¿
èŠãšããªãããããªãŒããŒããããåæžãããŸãã
ãªã³ã¯ãªã¹ãã¯ããå°ãªãã¡ã¢ãªã䜿çšããŸãã ãããã¡ãŒããããŸãããïŒ
ã³ã¬ã¯ã·ã§ã³ãéåžžã«å°ããå Žåã®ã¿ã
Vector
ã®ã¡ã¢ãªéã®äžéã¯ã
(1.5 * (size - 1)) * zval
ãã€ããå°ãªããšã* 10 * zval *ã§ãã äºéã«ãªã³ã¯ããããªã¹ãã§ã¯ã
(size * (zval + 8 + 8))
ã䜿çšãããŸãã ãããã£ãŠããªã³ã¯ãªã¹ãã¯ããµã€ãºã6èŠçŽ æªæºã®å Žåã«ã®ã¿ã
Vector
ãããå°ãªãã¡ã¢ãªã䜿çšããŸãã
ããŠ...ãªã³ã¯ãªã¹ãã¯ããå€ãã®ã¡ã¢ãªã䜿çšããŸããããªãé
ãã®ã§ããïŒ
ãªã³ã¯ãªã¹ãããŒãã®
空éçå±ææ§ã¯äžåå
ã§ã ã ããã¯ãã¡ã¢ãªå
ã®ããŒãã®ç©ççãªå Žæããé£æ¥ããããŒãããé ãé¢ããŠããå¯èœæ§ãããããšãæå³ããŸãã ãããã£ãŠããªã³ã¯ãªã¹ãã®ç¹°ãè¿ãã¯ãããã»ããµãã£ãã·ã¥ã䜿çšãã代ããã«ã¡ã¢ãªãããžã£ã³ãããŸãã
Vector
ãš
Deque
倧ããªå©ç¹ïŒèŠçŽ ã¯ç©ççã«é£ãåã£ãŠããŸãã
»æ§é ã«ãããããŒã¿ã®éé£ç¶æ§ã¯ããã¹ãŠã®ããã©ãŒãã³ã¹ã®æªã®æ ¹æºã§ãã å
·äœçã«ã¯ããªã³ã¯ãªã¹ãã«ããããããšèšã£ãŠãã ããã
ããªã³ã¯ããããªã¹ãã䜿çšããããããçŸä»£ã®ãã€ã¯ãããã»ããµã®ãã¹ãŠã®å©ç¹ã殺ãããã«ã§ããããšãããã»ãšãã©æ害ãªãã®ã¯ãããŸãããã
-ãã£ã³ãã©ãŒã»ã«ã«ãŒã¹ïŒ CppCon 2014 ïŒ
PHPã¯Webéçºçšã®èšèªã§ã-ããã©ãŒãã³ã¹ã¯éèŠã§ã¯ãããŸããã
ããã©ãŒãã³ã¹ã¯æåªå
äºé
ã§ã¯ãããŸãã ã
ã³ãŒãã¯ãäžè²«æ§ããããä¿å®å¯èœã§ãä¿¡é Œæ§ãé«ããäºæž¬å¯èœã§ãå®å
šã§ãç解ãããããã®ã§ãªããã°ãªããŸãããããããããã¯ããã©ãŒãã³ã¹ããéèŠã§ã¯ãªãããšããæå³ã§ã¯ãããŸãããè³ç£ã®ãµã€ãºãçž®å°ãããã¬ãŒã ã¯ãŒã¯ã®æ¯èŒåæãè¡ããæå³ã®ãªããã€ã¯ãæé©åãèãåºãããã«ãå€ãã®æéãè²»ãããŠããŸããããããæçµçã«ãPHP7ãäœããã®çç±ã§ããããçç£æ§ã®2åã®å¢å ã¯ãçãè奮ãããŸããã誰ã«ãšã£ãŠããããã¯PHP5ãã移è¡ããäž»ãªå©ç¹ã®1ã€ã§ããå¹ççãªã³ãŒãã«ããããµãŒããŒã®è² è·ã軜æžãããŸããAPIãšWebããŒãžã®å¿çæéãççž®ããéçºããŒã«ã®äœæ¥æéãççž®ããŸããé«ãããã©ãŒãã³ã¹ãéèŠã§ãããã³ãŒããµããŒãã¯äŸç¶ãšããŠæåç·ã«ãããŸãã
ãã£ã¹ã«ãã·ã§ã³ïŒTwitterãRedditãRoom 11ãœãŒã¹ã³ãŒãïŒgithub.com/php-dsãã³ãããŒã¯ïŒ github.com/php-ds/benchmarks