ãã¤ã³ã¿ç³»ãã¼ã¿æ§é ï¼æªå®ç¾©ãæ°æã¡ç¨èªï¼ãæ¸ãã¾ãããã
ã¾ããã
ããã§ãã¤ã³ã¿ç³»ãã¼ã¿æ§é ã¨å¼ãã§ããã®ã¯ãé åãäºåãã¼ãï¼ã®ããããå®è£ ï¼ãã»ã°æ¨ï¼ã®ããããå®è£ ï¼ã¨ã¯éããåè¦ç´ ãå¥ã®è¦ç´ ã®ã¢ãã¬ã¹ãæã¤å¿ è¦ããããããªãã®ã§ããç·å½¢ãªã¹ãã平衡äºåæ¨ãªã©ãããããããä¾ã§ãã
競ããçéã§ãã¤ã³ã¿ç³»ãã¼ã¿æ§é ã話é¡ã«ãªãã¨ãã¯ãæ¦ã次ã®ãããªãã¼ã¿æ§é ã®è©±ã§ãããã
- é«æ©è½ãªå¹³è¡¡æ¨*1
- æ·»åã§ã¢ã¯ã»ã¹ã§ãããã®
- merge/split ãå¯è½ãªãã®
- é«æ©è½ãªãã¼ã
- binomial heap, skew heap ãªã©ä½µåå¯è½ (meldable) ãªãã®
- Fibonacci heap ãªã©åªå 度ã®å¤æ´ãå¯è½ãªãã®
- åçæ¨
- link/cut tree, top tree ãªã©
- ãã®ä»
- trie, AhoâCorasick automaton ãªã©
é«æ©è½ãªå¹³è¡¡æ¨ã¯ãè¨èªã®æ¨æºã©ã¤ãã©ãªã§æä¾ããããã® (std::map
in C++, std::collections::BTreeMap
in Rust) ã§ã¯è¶³ããªãã¨ãã«èªåã§å®è£
ããå¿
è¦ãåºã¦ãããããªãã®ã§ãã
ãããã¯ç«¶ææèã§ã¯æ¯è¼çé¿ããããã¡ã§ããï¼ããããï¼å¹³è¡¡æ¨ã使ããã«è§£ããããã¨ãããªãã¹ããªãå®è£
ããªãã»ããããªã人ãå¤ãããã«è¦ãã¾ãã
ãå®è£ ã大å¤ãã¨ããå®æ¸¬ã ã¨éãããã¨ãããããè¨ã訳ã°ãããç®ã«ã¤ãã¦å«ã ãªãã¨ããæ°æã¡ãããã¤ã¤ããã§ã¯èªåã¯å®è£ ããããï¼ãã¨ããã¨ãã¾ãå®è£ ããããªãã§ãããã¨ããã®ãæ£ç´ãªã¨ããã§ãã ã¨ã¯ããããããããè¨ã訳ãããã¾ã¾ä¸çãçµãã¦æºè¶³ãï¼ãã¨åãããã¨ããããéãããªã¨ããæ°ããã¦ãã¾ããæè¿ã¯ããããææ ã°ããã§å«ã«ãªãã¾ãã
ããããã競ããçéã«ãããã風潮ãããï¼æ°ãããï¼ã®ã§ãã¤ã³ã¿ç³»ãã¼ã¿æ§é ã®å°å ¥ç¨ã®ææã¯ãã¾ããªããããããç¶æ ã§é«åº¦ãªãã¤ã³ã¿ç³»ãã¼ã¿æ§é ãè¦ãããã¦ãã大å¤ãããã¨ããææ ã«ãªã£ã¦ãã¾ãã®ã¯ãã¾ãç¡çããªãããªã¨ãæãã¾ãã ä½å¹´ãåã« FPS ãæµè¡ãå§ãã¦ãé ï¼å½æã¯ãæ¯é¢æ°ãã¨ããè¨ãæ¹ã§æããããã¨ãå¤ãã£ãã§ããï¼ãFPS ã®ä½ç³»çãªææããªãã¾ã¾é«åº¦ãªåé¡ã§ã®é©ç¨ä¾ã®è¨äºã ããã¡ãã»ããããéæ³ã®ãããªãã®ã«æãã¦ããã®ã¨ä¼¼ã¦ãããããªæ°ããã¾ãã
ã¨ããããã§ãç°¡åãªãã®ããæ¸ãã¦ãããã¨ã§ããããããããããããªããã©é£ããããã¨ããå¿é¿æãæããããããªã¨ããæ°æã¡ãããã¾ãã
ã¾ããå¥ã®èæ¯ã¨ãã¦ããã³ã¡ããã Unsafe Rust ã®åå¼·ãã¡ããã¨ãããã¨ããã¨ãããããã¾ãã ãã¤ã³ã¿ç³»ã®ãã¼ã¿æ§é ãæ¸ãã«ããã£ã¦ã¯ Safe Rust ã ã¨ã©ãã«ãéçãããããã§ãã Safe Rust ã§å®çµãããããªãã®ã§ããã°ããã§ããã§ãããUnsafe Rust ã使ãã¹ãç¶æ³ã§ Safe Rust ã«åºå·ããã®ã¯ãã¯ãããã¨ã¯æãã¾ããã ä¼¼ãä¾ã¨ãã¦ãæµ®åå°æ°ç¹æ°ã使ããããªãã®ã§æ´æ°ã«åºå·ããããæµ®åå°æ°ç¹æ°ã®åãæ±ãã¯ããããããªãããããæ°ããã¾ãã
ããããã
ç®æ¨ï¼ãã®è¨äºã®ç¯å²å¤ï¼ã¨ãã¦ã¯ãæ·»åã§ã®ã¢ã¯ã»ã¹ã¨ merge/split ãå¯è½ãªå¹³è¡¡æ¨ï¼ãããã B-treeï¼ãå®è£ ãããã¨ã§ãã ä¸è¨ã¯ç°¡åãªä¾ããå§ããã®ã§ Safe Rust ã§ãå®è£ ã§ããé¨åãããã§ãããããããã¾ã§ Unsafe Rust ã®ç·´ç¿ã¨ãããã¨ã§ãçãã¤ã³ã¿ãªã©ãé æ ®ããã«ä½¿ãã¾ãããã
ä¸è¨ã§ã¯ Rust ã®å®è£ ä¾ãããªãã§ãããC++ ã§ãå¦ç¿æ¹éèªä½ã¯åèã«ãªãã¨æãã¾ãã ãã¤ã³ã¿ã¾ããã®æªå®ç¾©åä½æ¤åºã«é¢ãã¦ãä¸è¨ã§ã¯ Rust åæ㧠Miri ãç´¹ä»ãã¦ãã¾ãããC++ï¼ã® UBSan ãªã©ï¼ï¼ã§ã©ã®ç¨åº¦ãããããã¨ãã§ãããã¯ãã¾ãç¥ããªãã§ãã C++ ã«ããã strict aliasing rule ã¾ããã®äºæ ã«é¢ãã¦ãå¿ãã¦ãã¾ãã¾ããã C++ ã«ãã ããããã人ã¯èª¿ã¹ã¦ã¿ãã¨ããã®ã§ã¯ãªãã§ããããã
åºç¤ãã¼ã
åºæ¬çãªæä½ã¨ãã¦ãä¸è¨ã®ãããªãã¨ãã§ããããã«ãªãã¾ãããã
- ä½ããã®å¤ãï¼å®è¡æã«ï¼ç¢ºä¿ãã¦ããã®å¤ã¸ã®ãã¤ã³ã¿ãåå¾ãã
- ãã¤ã³ã¿ãä»ãã¦å¤ã®èªã¿æ¸ãããã
- ãã¤ã³ã¿ãæãã¦ããå¤ã解æ¾ãã
- ã¡ã¢ãªãªã¼ã¯ãããªã
ãã¨ãã°æ¬¡ã®ãããªæãã§ãã
fn main() { // å¤ã確ä¿ãã¦çãã¤ã³ã¿ãåå¾ let p: *mut _ = Box::leak(Box::new("a".to_owned())); // ãã¤ã³ã¿ãä»ããå¤ã®èªã¿æ¸ã unsafe { assert_eq!(*p, "a"); *p += "b"; assert_eq!(*p, "ab"); } // å¤ã®è§£æ¾ unsafe { drop(Box::from_raw(p)) }; }
åç¨ã®ã«ã¼ã«ã«é¢ãã¦ãSafe Rust ã§ã¯ã³ã³ãã¤ã©ããã§ãã¯ãã¦ããã¦ããé¨åã Unsafe Rust ã§ã¯ããã°ã©ãããã§ãã¯ããå¿ è¦ãããã®ã§ãããã«é¢ãã¦ãå¦ãã§ããå¿ è¦ãããã¾ãã æè¿ã¯ Tree Borrows ã¨ããã¢ãã«ãåå¼·ããã®ãããã®ã§ããããã
unsafe { ... }
ã¯ãä¸æ£ã§å±éºãªã³ã¼ããæ¸ãã®ã許ããã*2ãã¨ããæå³ã§ã¯ãªãããã³ã³ãã¤ã©ã«ãã£ã¦ï¼éçã«ï¼å®å
¨æ§ãä¿è¨¼ã§ããªãé¨åããããã°ã©ãã責任ãæã£ã¦æ¸ããã¨ããæå³ãªã®ã§ãããããèªè¦ãæã¤å¿
è¦ãããã¾ãã
ä¸æ¦ as *mut _
ã¨ãããã¨ã§ lifetime ãæ¶å»ãããã¨ãã§ããã³ã³ãã¤ã©ã®ãç®ãã¼ããããã ããã¨ãã§ãã¾ãï¼æå¹ãªããã°ã©ã ã«ãªãã¨ããæå³ã§ã¯ãªãã®ã§æ³¨æã§ãï¼ã
fn main() { let mut a = 0; let p1 = unsafe { &mut *(&mut a as *mut i32) }; let p2 = unsafe { &mut *(&mut a as *mut i32) }; // åç¨ã«ã¼ã«ãç¡è¦ããå¤ã®èªã¿æ¸ãï¼æªå®ç¾©åä½ï¼ *p1 += 1; *p2 += 2; assert_eq!(a, 3); }
注
Stacked Borrows ã¨ããã¢ãã«ã«ããã¦ã¯ãp2
ãä½ã£ãæç¹ã§ p1
ã失å¹ãã¦ãã¾ãã®ã§ p1 += 1
ãä¸æ£ã§ãã
Tree Borrows ã«ããã¦ã¯ãp2
ãä½ã£ãæç¹ã§ã¯ p1
ã¯ã¾ã å¾
æ©ä¸ã¨ããæ±ã㧠p1 += 1
ã¯æå¹ã§ããããã®æ¸ãè¾¼ã¿ã«ãã£ã¦ p2
ã失å¹ã㦠p2 += 2
ãä¸æ£ã«ãªãã¾ãã$\eod$
ã¾ãã*mut _
ã§ã¯ãªã std::ptr::NonNull
ã使ãã®ãããããããã¾ãããnull ã§ãªããã¨ãä¿è¨¼ãã以å¤ã« variance ã®éããããã®ã§æ³¨æãå¿
è¦ã§ããvariance ã«ã¤ãã¦ã®èª¬æã¯ä¸æ¦å
延ã°ãã«ãã¾ãã
ãã¼ã«ã®ç´¹ä»
Rust ã§ã¯ Miri ã¨ãããã¼ã«ãããããã®æ©è½ã®ä¸ã¤ã¨ã㦠Stacked Borrows ã Tree Borrows ã§ã®éåã¢ã¯ã»ã¹ã®ãã§ãã¯ãããã¾ã*3ã ä¸è¨ã®ããã«å®è¡ããã°ããã§ãã
% MIRIFLAGS=-Zmiri-tree-borrows cargo miri run
ç¾ç¶ããã©ã«ãã§ã¯ Stacked Borrows ã使ããããªã®ã§ãStacked Borrows ã§è©¦ãããå ´å㯠cargo miri run
ã®ã¿ã§å¤§ä¸å¤«ããã§ãã
Miri ã§ã¯ãéåã¢ã¯ã»ã¹ãã§ãã¯ã«å ãã¦ã¡ã¢ãªãªã¼ã¯æ¤åºããã¦ããããããããããé¨åã®ãã¹ããã§ãã¦ããããã§ãã
ç·´ç¿ãã¼ã
ãããããã¨ãããã£ã¦ããã°ãããæãåãããããªãé ã ã¨æãã®ã§ãç°¡åãªãã¼ã¿æ§é ããå®è£ ãã¦ããã¾ãããã
ã¾ãã¯ãâ平衡ä¸åæ¨â ã¨ãã¦ã®ç·å½¢ãªã¹ã (linked list) ãå®è£ ãã¦ã¿ã¾ã*4ã ã¡ããã¨ããã¯ã©ã¹ã®å½¢ã§ã¾ã¨ããªãã¦ããã¤ã¡ã¼ã¸ãæ´ãã¨ããã¾ã§ã§ããã°ããããããã¾ããã ã¤ã¡ã¼ã¸ãã¤ãã«ãããã§ããã°ãã¯ã©ã¹ã®å½¢ã«ãã¦ã¿ãç·´ç¿ãããæ¹ãããããããã¾ããã
å®è£
ä¾
use std::ptr::NonNull; struct ListNode { val: i32, next: Option<NonNull<ListNode>>, } pub struct List { first_last: Option<(NonNull<ListNode>, NonNull<ListNode>)>, } impl ListNode { fn new(val: i32) -> NonNull<Self> { NonNull::from(Box::leak(Box::new(Self { val, next: None }))) } } impl List { pub fn new() -> Self { Self { first_last: None } } pub fn push(&mut self, elt: i32) { let node = ListNode::new(elt); if let Some((_, last)) = &mut self.first_last { unsafe { (*last.as_ptr()).next = Some(node) }; *last = node; } else { self.first_last = Some((node, node)); } } pub fn iter(&self) -> impl Iterator<Item = i32> + '_ { std::iter::successors( self.first_last.map(|(first, _)| first), |node| unsafe { (*node.as_ptr()).next }, ) .map(|node| unsafe { (*node.as_ptr()).val }) } } impl Drop for List { fn drop(&mut self) { if let Some((first, _)) = self.first_last { let mut next = Some(first); while let Some(node) = next { next = unsafe { (*node.as_ptr()).next }; unsafe { drop(Box::from_raw(node.as_ptr())) }; } } } } #[test] fn sanity_check() { let mut list = List::new(); assert!(list.iter().eq([])); list.push(1); list.push(2); assert!(list.iter().eq([1, 2])); }
ãããããã®ãã¨ãã§ããã°ãï¼è©²å½ã®ãã¼ã¿æ§é èªä½ã®ç解ã¯ãã¦ããåæã§ï¼å®è£ ã§ããããã«ãªã£ã¦ããã®ã§ã¯ãªãã§ããããã å°ãªãã¨ããè¨èªå´ã®åé¡ã§ããã¤ã³ã¿ã«é¢ããæ¸ãæ¹ãããããªãã»ç¥ããªãã®ã§å®è£ ã§ããªããã¨ããç¶æ ã¯è±ãã¦ããæ°ããã¾ãã
å¿ è¦ãªããç°¡åã®ããã«å¹³è¡¡ãã¦ããã¨ã¯éããªãäºåæ¨ãæ¸ãã¦ã¿ãã¨ããããããã¾ããã
ä»ã®ç·´ç¿
$n$ åã®ãã¼ããä½ãã$(i, p_i)$ ãåãåã£ã¦ã$i$ çªç®ã®ãã¼ãã®åãå ã $p_i$ çªç®ã®ãã¼ãã«ãããã¨ããæ´æ°ããã functional graph ç¶ã®ããã¡ããã¼ã¿æ§é ãæ¸ããããã¾ããããã¡ãããããªã®ã¯æ¬æ¥ Unsafe Rust ã使ããã«é åã§å®è£ ã§ãã¾ãã
å®è·µãã¼ã
ç·´ç¿ãã¦ãããã¡ã«ããããããã°ãã¤ã³ã¿ç³»ãã¼ã¿æ§é ã¨ã㦠Fibonacci heap ã£ã¦ãã£ãããã¨æãåºããã®ã§ãæ¸ãã¾ããã Fibonacci heap ã¯ãé常ã®åªå 度ã¤ããã¥ã¼ã®æä½ (new, push, pop) ã®ä»ã«ãå¥ã® Fibonacci heap ãä½µåããæä½ (meld) ã¨åªå 度ãä¸ããæä½ (urge)*5 ãã§ãã¾ãã è¨ç®éã¯ä¸è¨ã§ããåå´è¨ç®éã®ãã®ã¯ * ã§ãã¼ã¯ãã¦ãã¾ãã
æä½ | æéè¨ç®é |
---|---|
new, push, meld | $O(1)$ |
pop | $O(\log(n))$ * |
urge | $O(1)$ * |
ãã¦ãurge ãé©åã«ç¨ãããã¨ã§ãDijkstra æ³ã®æéè¨ç®éã $\Theta(m\log(n))$ ãã $\Theta(m+n\log(n))$ ã«è½ã¨ããã¨ãã§ãã¾ãã ãã¨ãã° ARC 064 E ã®ã°ã©ãã§ã¯ $m = \Theta(n^2)$ ãªã®ã§ãåè 㯠$\Theta(n^2\log(n))$ãå¾è 㯠$\Theta(n^2)$ ã¨ãªãã¾ãã ãã¡ãããurge ãç¨ããªã㧠$\Theta(m\log(n))$ æéã® Dijkstra æ³ã Fibonacci heap ã§å®è£ ãããã¨ãã§ãã¾ãã
ã¢ã«ã´ãªãºã | å®æ¸¬ |
---|---|
BinaryHeap , $\Theta(n^2\log(n))$ |
107 ms |
FibonacciHeap , $\Theta(n^2\log(n))$ |
1772 ms |
FibonacciHeap , $\Theta(n^2)$ |
25 ms (!) |
ãã¤ã³ã¿ç³»ãã¼ã¿æ§é ã ããã£ã¦å®æ°åã¯éãããã§ããããªã¼ãã¼ãè½ã¨ãããã®ã§ã¯æ¨æºã® BinaryHeap
ã®ãã®ãããé«éã ã£ãã®ã§ããããã£ãã§ãã
ä¸å¿ãAtCoder ã®ãã¹ãã±ã¼ã¹ä¸ã¤ãã¤ã«å¯¾ã㦠Miri (Tree Borrows) ã§æ¤è¨¼ããã®ã§ãæªå®ç¾©åä½ãã¡ã¢ãªãªã¼ã¯ã«é¢ãã¦ã¯å¤§ä¸å¤«ã ã¨æã£ã¦ãã¾ãã
å
¨ãã¹ãã±ã¼ã¹ã§ã®ãã¹ãã¯ãé常㮠cargo run --release
ã§ã¯ 1 ç§å¼±ãcargo run
ã§ã¯ 5 ç§å¼±ã§çµããã®ã«å¯¾ã㦠Miri ã§ã¯ 2.6 æ¥ ç¨åº¦ããããã¾ãã¡ãã£ã¨æéããããããã¨ãã£ãæãã§ããã
ãã¼ã¿æ§é ã«é¢ãã¦è£è¶³
Fibonacci heap ã¯ä»¥åãæ¸ãããã¨ãããããªã¤ãããæ°æã¡ã«ãªãã¾ããã urge ã®è¨ç®éä¿è¨¼ï¼expected ã§ã¯ãªã worst ã§ã$O(1)$ æéï¼ã®ããã«ãæ¨æ§é ãããç¹æ®ãªå½¢ã§æã¤ã¨ããã好ãã§ãã
åæã¨ãã¦ã次ã®ãã¨ãããã¾ãã
- æå®ãããã¼ãã親ããåãé¢ãæä½ã worst $O(1)$ æéã§ã§ããå¿ è¦ãããã
- æå®ãããã¼ãã«åã追å ããæä½ã worst $O(1)$ æéã§ã§ããå¿ è¦ãããã
- $k$ çªç®ã®åãåå¾ããã¨ããæä½ã¯å¿ è¦ãªãã
ï¼è¦ªããè¦ã¦ï¼ååã¸ã®ãã¤ã³ã¿ãé åã tree map ã§æã¤ã¨åé¤ã $O(1)$ æéã§ã§ãããhash map ã§æã¤ã¨ worst ãä¿è¨¼ã§ããªããªãã¾ãã ããã§ãååã¯è¦ªã¸ã®ãã¤ã³ã¿ãæã¡ã¤ã¤è¦ªã¯ã代表ã®åãã¸ã®ãã¤ã³ã¿ä¸ã¤ã ããä¿æããåãåãé¢ãéã¯ãèªåã代表ã®åã§ããã°ãï¼åã親ãæã¤ï¼ä»ã®åã代表ã«ãããã¨ããæä½ãããããã«ãã¾ãã åããä»ã®åã« worst $O(1)$ æéã§ã¢ã¯ã»ã¹ã§ããããã«ãããããåå士ã¯åç°ç¶ã«ãã¤ã³ã¿ã§çµãã§ããã¾ã (circularly-linked list)ã
[ parent ] ^ ^ | ^ ^ | | v | | [child 1] <--> [child 2] <--> [child 3] <--> [child 4] ^ ^ \------------------------------------------/
ã¢ã¹ãã¼ã¢ã¼ãã§è¡¨ç¾ããã®ãããé£ããã§ãããããããæãã§ãï¼2 çªã®åã代表ï¼ã
ã¾ããurge ã¯ããã®å¤ï¼ãã¼ããã©ãã«ãããã¯ç¥ããªãï¼ã®åªå 度ãä¸ããããã§ã¯ãªãããã®ãã¼ãã®åªå 度ãä¸ããããã¨ããæä½ã§ãã åè ï¼æ¤ç´¢ããè¡ãå¿ è¦ãããï¼ã§ã¯ãããã worst $O(1)$ æé ãéæã§ããªãããããã¼ããæå®ã§ãããããªã¤ã³ã¿ãã§ã¼ã¹ãæä¾ããå¿ è¦ãããã¾ãã
meld ã«é¢ãã¦ããï¼pop ãè¡ãã¾ã§å®éã®å¦çãé 延ããã¦ï¼worst $O(1)$ æéã§è¡ãã¾ãããã®ãããæ¨æ§é ãã¡ï¼ã®æ ¹ï¼ã linked list ã§ç®¡çãã¾ã*6ã
ãRust Fibonacci heapã㧠Google æ¤ç´¢ãã¦åºã¦ããå®è£ ã»è¨äºãä¸ãã 5 ã¤ãããèªã¿ã¾ãããããã®ããããã¡ããã¨ãã¦ãããã®ãã»ã¼ãªãã£ãã®ã§ããªããã£ãã§ãã
åå¼·ãã¼ã
ä»ã¯ B-tree ã®ãåå¼·ããã¦ãã¾ãã Fibonacci heap ã®é ã§ãå°ã触ãã¾ããããå®è£ ãè¡ãåã«è¨ç®é解æãå«ãã¦ç解ãã¦ãããã¨ã§ã誤ã£ãå®è£ ããã¦ãã¾ãã®ãé²ããã¨æãã¾ãã
ã¾ããallocate ã®æä½ã worst $O(1)$ æéãªã®ãã¯ç¥ããªãï¼ããä»®å®ããã®ã妥å½ãªã®ããç¥ããªãï¼ã®ã§ã調ã¹ãã®ããããããªæ°ããã¦ãã¾ãã
ãã¨ãã
ã§ããããªãã®ææããã£ã¦ã競ããçéã§ãã¤ã³ã¿ç³»ãã¼ã¿æ§é ãæµè¡ãæ°ãããªãããã æµè¡ããªãã®èªä½ã¯ãããã©ããããããã¼ã¿æ§é ãé£ããå«ãããã¾ã¾ãã¢ã«ã´ãªãºã ã«è©³ããéå£ãã¿ãããªé¡ããã¦ããã®ãæ°ã«é£ããªãã ã¨æã£ããã§ãããããããã¦æè¿ã¯ããããé¡ããã¦ãã人ã¯ããªãã§ããï¼ æãå°æ°ã ã£ãããã
Fibonacci heap ã®ãããªæ¨æ§é ã®æã¡æ¹ã¨ããè¨ç®éã« $\alpha(n)$ ãåºã¦ãããããªè¨è¨ã¨ãã¯ããã¾ãä¸è¬çãªãã¯ã¨ããæãã®åºã¾ãæ¹ããã¦ããªãæ°ããã¦ãã¦ããã£ã¨æ¥ã®ç®ãæµ´ã³ãªãããªãã¨æã£ãããã¦ãã¾ãã æ¢åã®ãã¤ãã¼ãã¯ãéæåã¨ããã ãã§ãªããï¼ã»ã°æ¨ã¨ãã®æ £ã親ããã ãã¼ã¿æ§é 以å¤ã®ï¼ãã¼ã¿æ§é ãæ°ããèããæ©ä¼ããã¾ããªããããªæ°ããã¾ãã ãããããã¨ã«èå³ã®ãã層ã¯ãã¾ãããªãã®ã§ããããã ãããã¯ããæ¯è¼çæ¯ãã¦ãã¾ã£ã¦ããé¨åãªã®ãããã
ããããã° fat-node red-black tree ã sardine tree / fusion tree ãªã©ã®ãåå¼·ãããªããã¨æã£ã¦ããã®ãå¿ãã¦ãã¾ããã
ãã¨ç°¡æ½ãã¼ã¿æ§é ã«é¢ãã¦ãè¨äºãæ¸ããã¨ãã¦å¯ãããã¾ã¾ã«ãªã£ã¦ããã®ãå¿ãã¦ãã¾ãã
ããã
ä¸æ¦ãããã§ããB-tree ãæ¸ãããã¾ãèªæ ¢ãã«æ¥ã¾ãã
*1:å¿ ãããäºåæ¨ã¨ã¯éããªããããããããå¼ã³æ¹ããã¦ãã¾ããç¾è¡ã® Rust ã®æ¨æºã©ã¤ãã©ãªã§ã¯ $2b$-åæ¨ ($b=6$) ã«ãªã£ã¦ãããã§ããB-tree ãªã®ã§ã$b$ ä»¥ä¸ $2b$ 以ä¸åæ¨ã§ããããã
*2:ã³ã³ãã¤ã©ãç§ã¯è¨±ãããã ãããã¤ã許ãããªï¼ã
*3:éç解æã§ã¯ãªããå®éã«å®è¡ãã¦éåãèµ·ãã¦ãããã確èªãããã®ãªã®ã§ãåä½ãã¹ãã¨ãã¦ä½¿ãå ´åã¯å ¥åã±ã¼ã¹ãé©åã«èããå¿ è¦ãããã¾ãã
*4:競ããé ã®äººã¯ãworst $\Theta(n)$ æéãªã®ã«å¹³è¡¡ã¨ã¯ï¼ãã¨æãããã§ãããæ ¹ããå ¨ã¦ã®èã¸ã®ãã¹ï¼ä¸æï¼ã®é·ããä¸å®ã§ãããã¨ãæãã¦å¹³è¡¡ã¨ãããã¨ã§ããã
*5:æå°å¤ãåãåºãããæèã§ã¯ decrease-key ã¨å¼ã¶å ´åããããIntroduction to Algorithms ã§ã¯ãããæ¡ç¨ãã¦ããã¨æãã¾ããããã§ã¯ä¸è¬ã®åªå 度ã£ã½ãå称ãæ¡ç¨ãã¾ããã以å㯠prioritize ã¨å¼ãã§ãã¾ããã
*6:ã¨ããã§ãä¸è¬ã® meldable heap 㧠push ããè¦ç´ ä¸ã¤ã ãã® heap ãä½æã㦠meld ãããã¨è¨ãæãããã¤ã好ãã§ãã