Files
krahets 81e6fc70d7 deploy
2026-11-04 05:26:02 +08:00

5353 lines
930 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html class="no-js" lang="ja">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width,initial-scale=1" name="viewport"/>
<meta content="アニメーションによる図解とワンクリックで実行できるコードで学ぶ、データ構造とアルゴリズムの入門書" name="description"/>
<meta content="krahets" name="author"/>
<link href="https://www.hello-algo.com/ja/chapter_hashing/hash_collision/" rel="canonical"/>
<link href="../hash_map/" rel="prev"/>
<link href="../hash_algorithm/" rel="next"/>
<link href="/chapter_hashing/hash_collision/" hreflang="zh" rel="alternate"/>
<link href="/zh-hant/chapter_hashing/hash_collision/" hreflang="zh-Hant" rel="alternate"/>
<link href="/en/chapter_hashing/hash_collision/" hreflang="en" rel="alternate"/>
<link href="/ja/chapter_hashing/hash_collision/" hreflang="ja" rel="alternate"/>
<link href="/ru/chapter_hashing/hash_collision/" hreflang="ru" rel="alternate"/>
<link href="/ko/chapter_hashing/hash_collision/" hreflang="ko" rel="alternate"/>
<link href="../../assets/images/favicon.png" rel="icon"/>
<meta content="zensical-0.0.51" name="generator"/>
<title>6.2 ハッシュ衝突 - Hello Algo</title>
<link href="../../assets/stylesheets/modern/main.62c9b9cc.min.css" rel="stylesheet"/>
<link href="../../assets/stylesheets/modern/palette.dfe2e883.min.css" rel="stylesheet"/>
<style>:root{--md-text-font:"Noto Sans JP";--md-code-font:"JetBrains Mono"}</style>
<link href="../../stylesheets/extra.css" rel="stylesheet"/>
<link href="../../stylesheets/animation_player.css" rel="stylesheet"/>
<script>__md_scope=new URL("../..",location),__md_scope.pathname.endsWith("/")||(__md_scope=new URL(__md_scope.pathname+"/",location)),__md_hash=e=>[...e].reduce(((e,t)=>(e<<5)-e+t.charCodeAt(0)),0),__md_get=(e,t=localStorage,_=__md_scope)=>JSON.parse(t.getItem(_.pathname+"."+e)),__md_set=(e,t,_=localStorage,a=__md_scope)=>{try{_.setItem(a.pathname+"."+e,JSON.stringify(t))}catch(e){}},document.documentElement.setAttribute("data-platform",navigator.platform)</script>
<script data-ha-shared-palette="1">
/* Share only the palette across language roots; other preferences stay scoped. */
(() => {
const get = __md_get;
const set = __md_set;
const shared = new URL("/", location);
__md_get = (key, storage = localStorage, scope = __md_scope) => {
if (key !== "__palette") return get(key, storage, scope);
let value = get(key, storage, shared);
// Adopt the current language's old preference only if none is shared yet.
if (value === null && scope.pathname !== shared.pathname) {
value = get(key, storage, scope);
if (value !== null) set(key, value, storage, shared);
}
return value;
};
__md_set = (key, value, storage = localStorage, scope = __md_scope) =>
set(key, value, storage, key === "__palette" ? shared : scope);
})();
</script>
<link href="/assets/figure-svg/css/e5c971c8d6831a5e9f627022.css" rel="stylesheet"/><link href="/assets/figure-svg/css/c053e5d2507ba0f764c3d1cf.css" rel="stylesheet"/></head>
<body data-md-color-accent="teal" data-md-color-primary="white" data-md-color-scheme="default" dir="ltr">
<input autocomplete="off" class="md-toggle" data-md-toggle="drawer" id="__drawer" type="checkbox"/>
<input autocomplete="off" class="md-toggle" data-md-toggle="search" id="__search" type="checkbox"/>
<label aria-label="ナビゲーション" class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a class="md-skip" href="#62">
コンテンツにスキップ
</a>
</div>
<div data-md-component="announce">
<aside class="md-banner">
<div class="md-banner__inner md-grid md-typeset">
</div>
</aside>
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav aria-label="ヘッダー" class="md-header__inner md-grid">
<a aria-label="Hello Algo" class="md-header__button md-logo" data-md-component="logo" href="../.." title="Hello Algo">
<img alt="Hello Algo" src="../../assets/images/logo.svg"/>
</a>
<label aria-label="ナビゲーション" class="md-header__button md-icon" for="__drawer">
<svg class="lucide lucide-menu" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M4 5h16M4 12h16M4 19h16"></path></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Hello Algo
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
6.2   ハッシュ衝突
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input aria-label="ダークモードに切り替える" class="md-option" data-md-color-accent="teal" data-md-color-media="none" data-md-color-primary="white" data-md-color-scheme="default" id="__palette_0" name="__palette" type="radio"/>
<label class="md-header__button md-icon" for="__palette_1" hidden="" title="ダークモードに切り替える">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M7.5 2c-1.79 1.15-3 3.18-3 5.5s1.21 4.35 3.03 5.5C4.46 13 2 10.54 2 7.5A5.5 5.5 0 0 1 7.5 2m11.57 1.5 1.43 1.43L4.93 20.5 3.5 19.07zm-6.18 2.43L11.41 5 9.97 6l.42-1.7L9 3.24l1.75-.12.58-1.65L12 3.1l1.73.03-1.35 1.13zm-3.3 3.61-1.16-.73-1.12.78.34-1.32-1.09-.83 1.36-.09.45-1.29.51 1.27 1.36.03-1.05.87zM19 13.5a5.5 5.5 0 0 1-5.5 5.5c-1.22 0-2.35-.4-3.26-1.07l7.69-7.69c.67.91 1.07 2.04 1.07 3.26m-4.4 6.58 2.77-1.15-.24 3.35zm4.33-2.7 1.15-2.77 2.2 2.54zm1.15-4.96-1.14-2.78 3.34.24zM9.63 18.93l2.77 1.15-2.53 2.19z"></path></svg>
</label>
<input aria-label="ライトモードに切り替える" class="md-option" data-md-color-accent="teal" data-md-color-media="none" data-md-color-primary="black" data-md-color-scheme="slate" id="__palette_1" name="__palette" type="radio"/>
<label class="md-header__button md-icon" for="__palette_0" hidden="" title="ライトモードに切り替える">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M7.5 2c-1.79 1.15-3 3.18-3 5.5s1.21 4.35 3.03 5.5C4.46 13 2 10.54 2 7.5A5.5 5.5 0 0 1 7.5 2m11.57 1.5 1.43 1.43L4.93 20.5 3.5 19.07zm-6.18 2.43L11.41 5 9.97 6l.42-1.7L9 3.24l1.75-.12.58-1.65L12 3.1l1.73.03-1.35 1.13zm-3.3 3.61-1.16-.73-1.12.78.34-1.32-1.09-.83 1.36-.09.45-1.29.51 1.27 1.36.03-1.05.87zM19 13.5a5.5 5.5 0 0 1-5.5 5.5c-1.22 0-2.35-.4-3.26-1.07l7.69-7.69c.67.91 1.07 2.04 1.07 3.26m-4.4 6.58 2.77-1.15-.24 3.35zm4.33-2.7 1.15-2.77 2.2 2.54zm1.15-4.96-1.14-2.78 3.34.24zM9.63 18.93l2.77 1.15-2.53 2.19z"></path></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<div class="md-header__option">
<div class="md-select">
<button aria-label="言語切り替え" class="md-header__button md-icon">
<svg class="lucide lucide-languages" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6"></path></svg>
</button>
<div class="md-select__inner">
<ul class="md-select__list">
<li class="md-select__item">
<a class="md-select__link" href="/chapter_hashing/hash_collision/" hreflang="zh">
简体中文
</a>
</li>
<li class="md-select__item">
<a class="md-select__link" href="/zh-hant/chapter_hashing/hash_collision/" hreflang="zh-Hant">
繁體中文
</a>
</li>
<li class="md-select__item">
<a class="md-select__link" href="/en/chapter_hashing/hash_collision/" hreflang="en">
English
</a>
</li>
<li class="md-select__item">
<a class="md-select__link" href="/ja/chapter_hashing/hash_collision/" hreflang="ja">
日本語
</a>
</li>
<li class="md-select__item">
<a class="md-select__link" href="/ru/chapter_hashing/hash_collision/" hreflang="ru">
Русский
</a>
</li>
<li class="md-select__item">
<a class="md-select__link" href="/ko/chapter_hashing/hash_collision/" hreflang="ko">
한국어
</a>
</li>
</ul>
</div>
</div>
</div>
<label aria-label="検索" class="md-header__button md-icon" for="__search">
<svg class="lucide lucide-search" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg>
</label>
<div aria-label="検索" class="md-search" data-md-component="search" role="dialog">
<button class="md-search__button" type="button">
検索
</button>
</div>
<div class="md-header__source">
<a class="md-source" data-md-component="source" href="https://github.com/krahets/hello-algo" title="リポジトリへ">
<div class="md-source__icon md-icon">
<svg viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2" fill="currentColor"></path></svg>
</div>
<div class="md-source__repository">
krahets/hello-algo
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation">
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav aria-label="ナビゲーション" class="md-nav md-nav--primary" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a aria-label="Hello Algo" class="md-nav__button md-logo" data-md-component="logo" href="../.." title="Hello Algo">
<img alt="Hello Algo" src="../../assets/images/logo.svg"/>
</a>
Hello Algo
</label>
<div class="md-nav__source">
<a class="md-source" data-md-component="source" href="https://github.com/krahets/hello-algo" title="リポジトリへ">
<div class="md-source__icon md-icon">
<svg viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2" fill="currentColor"></path></svg>
</div>
<div class="md-source__repository">
krahets/hello-algo
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_1" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_hello_algo/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m13.13 22.19-1.63-3.83c1.57-.58 3.04-1.36 4.4-2.27zM5.64 12.5l-3.83-1.63 6.1-2.77C7 9.46 6.22 10.93 5.64 12.5M19.22 4c.28 0 .53 0 .74.05.17 1.39-.02 4.25-3.3 7.53-1.7 1.71-3.73 3.02-6.01 3.89l-2.15-2.1c.92-2.31 2.23-4.34 3.92-6.03C15.18 4.58 17.64 4 19.22 4m0-2c-1.98 0-4.98.69-8.22 3.93-2.19 2.19-3.5 4.6-4.35 6.71-.28.75-.09 1.57.46 2.13l2.13 2.12c.38.38.89.61 1.42.61.23 0 .47-.06.7-.15A19.1 19.1 0 0 0 18.07 13c5.66-5.66 3.54-10.61 3.54-10.61S20.7 2 19.22 2m-4.68 7.46c-.78-.78-.78-2.05 0-2.83s2.05-.78 2.83 0c.77.78.78 2.05 0 2.83s-2.05.78-2.83 0m-5.66 7.07-1.41-1.41zM6.24 22l3.64-3.64c-.34-.09-.67-.24-.97-.45L4.83 22zM2 22h1.41l4.77-4.76-1.42-1.41L2 20.59zm0-2.83 4.09-4.08c-.21-.3-.36-.62-.45-.97L2 17.76z"></path></svg>
<span class="md-ellipsis">
序文
</span>
</a>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_1_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_1">
<span class="md-nav__icon md-icon"></span>
序文
</label>
<ul class="md-nav__list" data-md-scrollfix="">
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_2" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_preface/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M21 4H3a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M3 19V6h8v13zm18 0h-8V6h8zm-7-9.5h6V11h-6zm0 2.5h6v1.5h-6zm0 2.5h6V16h-6z"></path></svg>
<span class="md-ellipsis">
第 0 章   はじめに
</span>
</a>
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_2_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
第 0 章   はじめに
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_preface/about_the_book/">
<span class="md-ellipsis">
0.1   本書について
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_preface/suggestions/">
<span class="md-ellipsis">
0.2   本書の使い方
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_preface/summary/">
<span class="md-ellipsis">
0.3   まとめ
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_3" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_introduction/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m0 16H5V5h14zM6.2 7.7h5v1.5h-5zm6.8 8.1h5v1.5h-5zm0-2.6h5v1.5h-5zM8 18h1.5v-2h2v-1.5h-2v-2H8v2H6V16h2zm6.1-7.1 1.4-1.4 1.4 1.4 1.1-1-1.4-1.4L18 7.1 16.9 6l-1.4 1.4L14.1 6 13 7.1l1.4 1.4L13 9.9z"></path></svg>
<span class="md-ellipsis">
第 1 章   アルゴリズムとの出会い
</span>
</a>
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_3_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
第 1 章   アルゴリズムとの出会い
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_introduction/algorithms_are_everywhere/">
<span class="md-ellipsis">
1.1   アルゴリズムはどこにでもある
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_introduction/what_is_dsa/">
<span class="md-ellipsis">
1.2   アルゴリズムとは
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_introduction/summary/">
<span class="md-ellipsis">
1.3   まとめ
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_4" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_computational_complexity/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 2h12v6l-4 4 4 4v6H6v-6l4-4-4-4zm10 14.5-4-4-4 4V20h8zm-4-5 4-4V4H8v3.5zM10 6h4v.75l-2 2-2-2z"></path></svg>
<span class="md-ellipsis">
第 2 章   計算量の解析
</span>
</a>
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_4_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
第 2 章   計算量の解析
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_computational_complexity/performance_evaluation/">
<span class="md-ellipsis">
2.1   アルゴリズムの効率の評価
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_computational_complexity/iteration_and_recursion/">
<span class="md-ellipsis">
2.2   反復と再帰
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_computational_complexity/time_complexity/">
<span class="md-ellipsis">
2.3   時間計算量
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_computational_complexity/space_complexity/">
<span class="md-ellipsis">
2.4   空間計算量
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_computational_complexity/summary/">
<span class="md-ellipsis">
2.5   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_computational_complexity/exercises/">
<span class="md-ellipsis">
2.6   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_5" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_data_structure/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M11 13.5v8H3v-8zm-2 2H5v4h4zM12 2l5.5 9h-11zm0 3.86L10.08 9h3.84zM17.5 13c2.5 0 4.5 2 4.5 4.5S20 22 17.5 22 13 20 13 17.5s2-4.5 4.5-4.5m0 2a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-2.5-2.5"></path></svg>
<span class="md-ellipsis">
第 3 章   データ構造
</span>
</a>
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_5_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
第 3 章   データ構造
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_data_structure/classification_of_data_structure/">
<span class="md-ellipsis">
3.1   データ構造の分類
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_data_structure/basic_data_types/">
<span class="md-ellipsis">
3.2   基本データ型
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_data_structure/number_encoding/">
<span class="md-ellipsis">
3.3   数値の符号化 *
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_data_structure/character_encoding/">
<span class="md-ellipsis">
3.4   文字エンコーディング *
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_data_structure/summary/">
<span class="md-ellipsis">
3.5   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_data_structure/exercises/">
<span class="md-ellipsis">
3.6   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_6" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M3 5v14h17V5zm4 2v2H5V7zm-2 6v-2h2v2zm0 2h2v2H5zm13 2H9v-2h9zm0-4H9v-2h9zm0-4H9V7h9z"></path></svg>
<span class="md-ellipsis">
第 4 章   配列と連結リスト
</span>
</a>
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_6_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
第 4 章   配列と連結リスト
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/array/">
<span class="md-ellipsis">
4.1   配列
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/linked_list/">
<span class="md-ellipsis">
4.2   連結リスト
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/list/">
<span class="md-ellipsis">
4.3   リスト
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/ram_and_cache/">
<span class="md-ellipsis">
4.4   メモリとキャッシュ *
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/summary/">
<span class="md-ellipsis">
4.5   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/exercises/">
<span class="md-ellipsis">
4.6   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_7" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_stack_and_queue/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17.36 20.2v-5.38h1.79V22H3v-7.18h1.8v5.38zM6.77 14.32l.37-1.76 8.79 1.85-.37 1.76zm1.16-4.21.76-1.61 8.14 3.78-.76 1.62zm2.26-3.99 1.15-1.38 6.9 5.76-1.15 1.37zm4.45-4.25L20 9.08l-1.44 1.07-5.36-7.21zM6.59 18.41v-1.8h8.98v1.8z"></path></svg>
<span class="md-ellipsis">
第 5 章   スタックとキュー
</span>
</a>
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_7_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
第 5 章   スタックとキュー
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_stack_and_queue/stack/">
<span class="md-ellipsis">
5.1   スタック
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_stack_and_queue/queue/">
<span class="md-ellipsis">
5.2   キュー
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_stack_and_queue/deque/">
<span class="md-ellipsis">
5.3   両端キュー
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_stack_and_queue/summary/">
<span class="md-ellipsis">
5.4   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_stack_and_queue/exercises/">
<span class="md-ellipsis">
5.5   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input checked="" class="md-nav__toggle md-toggle" id="__nav_8" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.3 17.89c1.32-2.1.7-4.89-1.41-6.21a4.52 4.52 0 0 0-6.21 1.41C10.36 15.2 11 18 13.09 19.3c1.47.92 3.33.92 4.8 0L21 22.39 22.39 21zm-2-.62c-.98.98-2.56.97-3.54 0-.97-.98-.97-2.56.01-3.54.97-.97 2.55-.97 3.53 0 .96.99.95 2.57-.03 3.54zM19 4H5a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.81a6.3 6.3 0 0 1-1.31-2H5v-4h4.18c.16-.71.43-1.39.82-2H5V8h6v2.81a6.3 6.3 0 0 1 2-1.31V8h6v2a6.499 6.499 0 0 1 2 2V6a2 2 0 0 0-2-2"></path></svg>
<span class="md-ellipsis">
第 6 章   ハッシュテーブル
</span>
</a>
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="true" aria-labelledby="__nav_8_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
第 6 章   ハッシュテーブル
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../hash_map/">
<span class="md-ellipsis">
6.1   ハッシュテーブル
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
6.2   ハッシュ衝突
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a class="md-nav__link md-nav__link--active" href="././">
<span class="md-ellipsis">
6.2   ハッシュ衝突
</span>
</a>
<nav aria-label="目次" class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目次
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="#621">
<span class="md-ellipsis">
<span class="md-typeset">
6.2.1   チェイン法
</span>
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#622">
<span class="md-ellipsis">
<span class="md-typeset">
6.2.2   オープンアドレス法
</span>
</span>
</a>
<nav aria-label="6.2.2 オープンアドレス法" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#1">
<span class="md-ellipsis">
<span class="md-typeset">
1.   線形探索法
</span>
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#2">
<span class="md-ellipsis">
<span class="md-typeset">
2.   平方探索法
</span>
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#3">
<span class="md-ellipsis">
<span class="md-typeset">
3.   複数のハッシュ関数を使う方法
</span>
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#623">
<span class="md-ellipsis">
<span class="md-typeset">
6.2.3   プログラミング言語ごとの選択
</span>
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../hash_algorithm/">
<span class="md-ellipsis">
6.3   ハッシュアルゴリズム
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../summary/">
<span class="md-ellipsis">
6.4   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../exercises/">
<span class="md-ellipsis">
6.5   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_9" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_tree/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.5 17c-.14 0-.26 0-.39.04L17.5 13.8c.45-.45.75-1.09.75-1.8a2.5 2.5 0 0 0-2.5-2.5c-.14 0-.25 0-.4.04L13.74 6.3c.47-.46.76-1.09.76-1.8a2.5 2.5 0 0 0-5 0c0 .7.29 1.34.76 1.79L8.65 9.54c-.15-.04-.26-.04-.4-.04a2.5 2.5 0 0 0-2.5 2.5c0 .71.29 1.34.75 1.79l-1.61 3.25C4.76 17 4.64 17 4.5 17a2.5 2.5 0 0 0 0 5A2.5 2.5 0 0 0 7 19.5c0-.7-.29-1.34-.76-1.79l1.62-3.25c.14.04.26.04.39.04s.25 0 .38-.04l1.63 3.25c-.47.45-.76 1.09-.76 1.79a2.5 2.5 0 0 0 5 0A2.5 2.5 0 0 0 12 17c-.13 0-.26 0-.39.04L10 13.8c.45-.45.75-1.09.75-1.8 0-.7-.29-1.33-.75-1.79l1.61-3.25c.13.04.26.04.39.04s.26 0 .39-.04L14 10.21a2.5 2.5 0 0 0 1.75 4.29c.13 0 .25 0 .38-.04l1.63 3.25c-.47.45-.76 1.09-.76 1.79a2.5 2.5 0 0 0 5 0 2.5 2.5 0 0 0-2.5-2.5m-15 3.5c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1m8.5-1c0 .55-.45 1-1 1s-1-.45-1-1 .45-1 1-1 1 .45 1 1M7.25 12c0-.55.45-1 1-1s1 .45 1 1-.45 1-1 1-1-.45-1-1M11 4.5c0-.55.45-1 1-1s1 .45 1 1-.45 1-1 1-1-.45-1-1m3.75 7.5c0-.55.45-1 1-1s1 .45 1 1-.45 1-1 1-1-.45-1-1m4.75 8.5c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1"></path></svg>
<span class="md-ellipsis">
第 7 章   木
</span>
</a>
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_9_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
第 7 章   木
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_tree/binary_tree/">
<span class="md-ellipsis">
7.1   二分木
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_tree/binary_tree_traversal/">
<span class="md-ellipsis">
7.2   二分木の走査
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_tree/array_representation_of_tree/">
<span class="md-ellipsis">
7.3   二分木の配列表現
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_tree/binary_search_tree/">
<span class="md-ellipsis">
7.4   二分探索木
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_tree/avl_tree/">
<span class="md-ellipsis">
7.5   AVL 木 *
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_tree/summary/">
<span class="md-ellipsis">
7.6   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_tree/exercises/">
<span class="md-ellipsis">
7.7   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_10" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_heap/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 1a2.5 2.5 0 0 0-2.5 2.5A2.5 2.5 0 0 0 11 5.79V7H7a2 2 0 0 0-2 2v.71A2.5 2.5 0 0 0 3.5 12 2.5 2.5 0 0 0 5 14.29V15H4a2 2 0 0 0-2 2v1.21A2.5 2.5 0 0 0 .5 20.5 2.5 2.5 0 0 0 3 23a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 4 18.21V17h4v1.21a2.5 2.5 0 0 0-1.5 2.29A2.5 2.5 0 0 0 9 23a2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-1.5-2.29V17a2 2 0 0 0-2-2H7v-.71A2.5 2.5 0 0 0 8.5 12 2.5 2.5 0 0 0 7 9.71V9h10v.71A2.5 2.5 0 0 0 15.5 12a2.5 2.5 0 0 0 1.5 2.29V15h-1a2 2 0 0 0-2 2v1.21a2.5 2.5 0 0 0-1.5 2.29A2.5 2.5 0 0 0 15 23a2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-1.5-2.29V17h4v1.21a2.5 2.5 0 0 0-1.5 2.29A2.5 2.5 0 0 0 21 23a2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-1.5-2.29V17a2 2 0 0 0-2-2h-1v-.71A2.5 2.5 0 0 0 20.5 12 2.5 2.5 0 0 0 19 9.71V9a2 2 0 0 0-2-2h-4V5.79a2.5 2.5 0 0 0 1.5-2.29A2.5 2.5 0 0 0 12 1m0 1.5a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1M6 11a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m12 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1M3 19.5a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m6 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m6 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m6 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1"></path></svg>
<span class="md-ellipsis">
第 8 章   ヒープ
</span>
</a>
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_10_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
第 8 章   ヒープ
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_heap/heap/">
<span class="md-ellipsis">
8.1   ヒープ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_heap/build_heap/">
<span class="md-ellipsis">
8.2   ヒープの構築
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_heap/top_k/">
<span class="md-ellipsis">
8.3   Top-k 問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_heap/summary/">
<span class="md-ellipsis">
8.4   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_heap/exercises/">
<span class="md-ellipsis">
8.5   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_11" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_graph/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m12 5.37-.44-.06L6 14.9c.24.21.4.48.47.78h11.06c.07-.3.23-.57.47-.78l-5.56-9.59zM6.6 16.53l4.28 2.53c.29-.27.69-.43 1.12-.43s.83.16 1.12.43l4.28-2.53zM12 22a1.68 1.68 0 0 1-1.68-1.68l.09-.56-4.3-2.55c-.31.36-.76.58-1.27.58a1.68 1.68 0 0 1-1.68-1.68c0-.79.53-1.45 1.26-1.64V9.36c-.83-.11-1.47-.82-1.47-1.68A1.68 1.68 0 0 1 4.63 6c.55 0 1.03.26 1.34.66l4.41-2.53-.06-.45c0-.93.75-1.68 1.68-1.68s1.68.75 1.68 1.68l-.06.45 4.41 2.53c.31-.4.79-.66 1.34-.66a1.68 1.68 0 0 1 1.68 1.68c0 .86-.64 1.57-1.47 1.68v5.11c.73.19 1.26.85 1.26 1.64a1.68 1.68 0 0 1-1.68 1.68c-.51 0-.96-.22-1.27-.58l-4.3 2.55.09.56A1.68 1.68 0 0 1 12 22M10.8 4.86 6.3 7.44l.02.24c0 .71-.44 1.32-1.06 1.57l.03 5.25zm2.4 0 5.51 9.64.03-5.25c-.62-.25-1.06-.86-1.06-1.57l.02-.24z"></path></svg>
<span class="md-ellipsis">
第 9 章   グラフ
</span>
</a>
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_11_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
第 9 章   グラフ
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_graph/graph/">
<span class="md-ellipsis">
9.1   グラフ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_graph/graph_operations/">
<span class="md-ellipsis">
9.2   グラフの基本操作
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_graph/graph_traversal/">
<span class="md-ellipsis">
9.3   グラフの走査
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_graph/summary/">
<span class="md-ellipsis">
9.4   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_graph/exercises/">
<span class="md-ellipsis">
9.5   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_12" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_searching/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m19.31 18.9 3.08 3.1L21 23.39l-3.12-3.07c-.69.43-1.51.68-2.38.68-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5c0 .88-.25 1.71-.69 2.4m-3.81.1a2.5 2.5 0 0 0 0-5 2.5 2.5 0 0 0 0 5M21 4v2H3V4zM3 16v-2h6v2zm0-5V9h18v2h-2.03c-1.01-.63-2.2-1-3.47-1s-2.46.37-3.47 1z"></path></svg>
<span class="md-ellipsis">
第 10 章   探索
</span>
</a>
<label class="md-nav__link" for="__nav_12" id="__nav_12_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_12_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_12">
<span class="md-nav__icon md-icon"></span>
第 10 章   探索
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_searching/binary_search/">
<span class="md-ellipsis">
10.1   二分探索
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_searching/binary_search_insertion/">
<span class="md-ellipsis">
10.2   二分探索で挿入位置を探す
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_searching/binary_search_edge/">
<span class="md-ellipsis">
10.3   二分探索で境界を探す
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_searching/replace_linear_by_hashing/">
<span class="md-ellipsis">
10.4   ハッシュを使った最適化
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_searching/searching_algorithm_revisited/">
<span class="md-ellipsis">
10.5   探索アルゴリズムを改めて考える
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_searching/summary/">
<span class="md-ellipsis">
10.6   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_searching/exercises/">
<span class="md-ellipsis">
10.7   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_13" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_sorting/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19 17h3l-4 4-4-4h3V3h2M2 17h10v2H2M6 5v2H2V5m0 6h7v2H2z"></path></svg>
<span class="md-ellipsis">
第 11 章   ソート
</span>
</a>
<label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_13_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
第 11 章   ソート
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/sorting_algorithm/">
<span class="md-ellipsis">
11.1   ソートアルゴリズム
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/selection_sort/">
<span class="md-ellipsis">
11.2   選択ソート
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/bubble_sort/">
<span class="md-ellipsis">
11.3   バブルソート
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/insertion_sort/">
<span class="md-ellipsis">
11.4   挿入ソート
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/quick_sort/">
<span class="md-ellipsis">
11.5   クイックソート
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/merge_sort/">
<span class="md-ellipsis">
11.6   マージソート
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/heap_sort/">
<span class="md-ellipsis">
11.7   ヒープソート
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/bucket_sort/">
<span class="md-ellipsis">
11.8   バケットソート
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/counting_sort/">
<span class="md-ellipsis">
11.9   カウントソート
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/radix_sort/">
<span class="md-ellipsis">
11.10   基数ソート
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/summary/">
<span class="md-ellipsis">
11.11   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_sorting/exercises/">
<span class="md-ellipsis">
11.12   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_14" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_divide_and_conquer/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17 7v2h5V7zM2 9v6h5V9zm10 0v2H9v2h3v2l3-3zm5 2v2h5v-2zm0 4v2h5v-2z"></path></svg>
<span class="md-ellipsis">
第 12 章   分割統治
</span>
</a>
<label class="md-nav__link" for="__nav_14" id="__nav_14_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_14_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_14">
<span class="md-nav__icon md-icon"></span>
第 12 章   分割統治
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_divide_and_conquer/divide_and_conquer/">
<span class="md-ellipsis">
12.1   分割統治アルゴリズム
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_divide_and_conquer/binary_search_recur/">
<span class="md-ellipsis">
12.2   分割統治による探索戦略
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_divide_and_conquer/build_binary_tree_problem/">
<span class="md-ellipsis">
12.3   二分木の構築問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_divide_and_conquer/hanota_problem/">
<span class="md-ellipsis">
12.4   ハノイの塔の問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_divide_and_conquer/summary/">
<span class="md-ellipsis">
12.5   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_divide_and_conquer/exercises/">
<span class="md-ellipsis">
12.6   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_15" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_backtracking/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M18 15a3 3 0 0 1 3 3 3 3 0 0 1-3 3 2.99 2.99 0 0 1-2.83-2H14v-2h1.17c.41-1.17 1.52-2 2.83-2m0 2a1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1m0-9a1.43 1.43 0 0 0 1.43-1.43 1.43 1.43 0 1 0-2.86 0A1.43 1.43 0 0 0 18 8m0-5.43a4 4 0 0 1 4 4C22 9.56 18 14 18 14s-4-4.44-4-7.43a4 4 0 0 1 4-4M8.83 17H10v2H8.83A2.99 2.99 0 0 1 6 21a3 3 0 0 1-3-3c0-1.31.83-2.42 2-2.83V14h2v1.17c.85.3 1.53.98 1.83 1.83M6 17a1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1M6 3a3 3 0 0 1 3 3c0 1.31-.83 2.42-2 2.83V10H5V8.83A2.99 2.99 0 0 1 3 6a3 3 0 0 1 3-3m0 2a1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1m5 14v-2h2v2zm-4-6H5v-2h2z"></path></svg>
<span class="md-ellipsis">
第 13 章   バックトラッキング
</span>
</a>
<label class="md-nav__link" for="__nav_15" id="__nav_15_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_15_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
第 13 章   バックトラッキング
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_backtracking/backtracking_algorithm/">
<span class="md-ellipsis">
13.1   バックトラッキングアルゴリズム
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_backtracking/permutations_problem/">
<span class="md-ellipsis">
13.2   順列列挙問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_backtracking/subset_sum_problem/">
<span class="md-ellipsis">
13.3   部分集合和問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_backtracking/n_queens_problem/">
<span class="md-ellipsis">
13.4   n クイーン問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_backtracking/summary/">
<span class="md-ellipsis">
13.5   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_backtracking/exercises/">
<span class="md-ellipsis">
13.6   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_16" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_dynamic_programming/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M22 15h-2v3c0 1.11-.89 2-2 2h-3v2l-3-3 3-3v2h3v-3h-2l3-3zm0-11v4c0 1.1-.9 2-2 2H10v10c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h16c1.1 0 2 .9 2 2M4 8h4V4H4zm0 2v4h4v-4zm4 10v-4H4v4zm6-12V4h-4v4zm6-4h-4v4h4z"></path></svg>
<span class="md-ellipsis">
第 14 章   動的計画法
</span>
</a>
<label class="md-nav__link" for="__nav_16" id="__nav_16_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_16_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_16">
<span class="md-nav__icon md-icon"></span>
第 14 章   動的計画法
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_dynamic_programming/intro_to_dynamic_programming/">
<span class="md-ellipsis">
14.1   動的計画法への第一歩
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_dynamic_programming/dp_problem_features/">
<span class="md-ellipsis">
14.2   動的計画法の問題の特徴
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_dynamic_programming/dp_solution_pipeline/">
<span class="md-ellipsis">
14.3   動的計画法の解き方
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_dynamic_programming/knapsack_problem/">
<span class="md-ellipsis">
14.4   0-1 ナップサック問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_dynamic_programming/unbounded_knapsack_problem/">
<span class="md-ellipsis">
14.5   個数制限なしナップサック問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_dynamic_programming/edit_distance_problem/">
<span class="md-ellipsis">
14.6   編集距離問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_dynamic_programming/summary/">
<span class="md-ellipsis">
14.7   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_dynamic_programming/exercises/">
<span class="md-ellipsis">
14.8   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_17" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_greedy/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M13 3c3.88 0 7 3.14 7 7 0 2.8-1.63 5.19-4 6.31V21H9v-3H8c-1.11 0-2-.89-2-2v-3H4.5c-.42 0-.66-.5-.42-.81L6 9.66A7.003 7.003 0 0 1 13 3m0-2C8.41 1 4.61 4.42 4.06 8.9L2.5 11h-.03l-.02.03c-.55.76-.62 1.76-.19 2.59.36.69 1 1.17 1.74 1.32V16c0 1.85 1.28 3.42 3 3.87V23h11v-5.5c2.5-1.67 4-4.44 4-7.5 0-4.97-4.04-9-9-9m4 7.83c0 1.54-1.36 2.77-3.42 4.64L13 14l-.58-.53C10.36 11.6 9 10.37 9 8.83c0-1.2.96-2.19 2.16-2.2h.04c.69 0 1.35.31 1.8.83.45-.52 1.11-.83 1.8-.83 1.2-.01 2.2.96 2.2 2.16z"></path></svg>
<span class="md-ellipsis">
第 15 章   貪欲法
</span>
</a>
<label class="md-nav__link" for="__nav_17" id="__nav_17_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_17_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_17">
<span class="md-nav__icon md-icon"></span>
第 15 章   貪欲法
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_greedy/greedy_algorithm/">
<span class="md-ellipsis">
15.1   貪欲アルゴリズム
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_greedy/fractional_knapsack_problem/">
<span class="md-ellipsis">
15.2   分割可能ナップサック問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_greedy/max_capacity_problem/">
<span class="md-ellipsis">
15.3   最大容量問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_greedy/max_product_cutting_problem/">
<span class="md-ellipsis">
15.4   整数を分割して積を最大にする問題
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_greedy/summary/">
<span class="md-ellipsis">
15.5   まとめ
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_greedy/exercises/">
<span class="md-ellipsis">
15.6   練習問題
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_18" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_appendix/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M11 18h2v-2h-2zm1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4"></path></svg>
<span class="md-ellipsis">
第 16 章   付録
</span>
</a>
<label class="md-nav__link" for="__nav_18" id="__nav_18_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_18_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_18">
<span class="md-nav__icon md-icon"></span>
第 16 章   付録
</label>
<ul class="md-nav__list" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_appendix/installation/">
<span class="md-ellipsis">
16.1   プログラミング環境のインストール
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_appendix/contribution/">
<span class="md-ellipsis">
16.2   一緒に本書を作りましょう
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="../../chapter_appendix/terminology/">
<span class="md-ellipsis">
16.3   用語集
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle" id="__nav_19" type="checkbox"/>
<div class="md-nav__link md-nav__container">
<a class="md-nav__link" href="../../chapter_reference/">
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M9 3v15h3V3zm3 2 4 13 3-1-4-13zM5 5v13h3V5zM3 19v2h18v-2z"></path></svg>
<span class="md-ellipsis">
参考文献
</span>
</a>
</div>
<nav aria-expanded="false" aria-labelledby="__nav_19_label" class="md-nav" data-md-level="1">
<label class="md-nav__title" for="__nav_19">
<span class="md-nav__icon md-icon"></span>
参考文献
</label>
<ul class="md-nav__list" data-md-scrollfix="">
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc">
<div class="md-sidebar__scrollwrap">
<input class="md-nav__toggle md-toggle" id="__toc" type="checkbox"/>
<div class="md-sidebar-button__wrapper">
<label class="md-sidebar-button" for="__toc"></label>
</div>
<div class="md-sidebar__inner">
<nav aria-label="目次" class="md-nav md-nav--secondary">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目次
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix="">
<li class="md-nav__item">
<a class="md-nav__link" href="#621">
<span class="md-ellipsis">
<span class="md-typeset">
6.2.1   チェイン法
</span>
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#622">
<span class="md-ellipsis">
<span class="md-typeset">
6.2.2   オープンアドレス法
</span>
</span>
</a>
<nav aria-label="6.2.2 オープンアドレス法" class="md-nav">
<ul class="md-nav__list">
<li class="md-nav__item">
<a class="md-nav__link" href="#1">
<span class="md-ellipsis">
<span class="md-typeset">
1.   線形探索法
</span>
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#2">
<span class="md-ellipsis">
<span class="md-typeset">
2.   平方探索法
</span>
</span>
</a>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#3">
<span class="md-ellipsis">
<span class="md-typeset">
3.   複数のハッシュ関数を使う方法
</span>
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a class="md-nav__link" href="#623">
<span class="md-ellipsis">
<span class="md-typeset">
6.2.3   プログラミング言語ごとの選択
</span>
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<!-- Tags -->
<!-- Actions -->
<!-- Actions -->
<!-- Edit button -->
<a class="md-content__button md-icon" href="https://github.com/krahets/hello-algo/tree/main/ja/docs/chapter_hashing/hash_collision.md" title="編集">
<svg viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M441 58.9 453.1 71c9.4 9.4 9.4 24.6 0 33.9L424 134.1 377.9 88 407 58.9c9.4-9.4 24.6-9.4 33.9 0zM209.8 256.2 344 121.9l46.1 46.1-134.3 134.2c-2.9 2.9-6.5 5-10.4 6.1L186.9 325l16.7-58.5c1.1-3.9 3.2-7.5 6.1-10.4zM373.1 25 175.8 222.2c-8.7 8.7-15 19.4-18.3 31.1l-28.6 100c-2.4 8.4-.1 17.4 6.1 23.6s15.2 8.5 23.6 6.1l100-28.6c11.8-3.4 22.5-9.7 31.1-18.3L487 138.9c28.1-28.1 28.1-73.7 0-101.8L474.9 25c-28.1-28.1-73.7-28.1-101.8 0M88 64c-48.6 0-88 39.4-88 88v272c0 48.6 39.4 88 88 88h272c48.6 0 88-39.4 88-88V312c0-13.3-10.7-24-24-24s-24 10.7-24 24v112c0 22.1-17.9 40-40 40H88c-22.1 0-40-17.9-40-40V152c0-22.1 17.9-40 40-40h112c13.3 0 24-10.7 24-24s-10.7-24-24-24z" fill="currentColor"></path></svg>
</a>
<!-- View button -->
<!-- Page content -->
<h1 id="62">6.2   ハッシュ衝突<a class="headerlink" href="#62" title="この見出しへのリンク"></a></h1>
<p>前節で述べたように、<strong>通常、ハッシュ関数の入力空間は出力空間よりはるかに大きいため</strong>、理論上、ハッシュ衝突は避けられません。例えば、入力がすべての整数で、出力の範囲が配列の容量なら、複数の整数が同じバケットのインデックスに写されることは必然です。</p>
<p>ハッシュ衝突は誤った照会結果を生み、ハッシュテーブルの利用に重大な影響を与えます。衝突するたびに、解消するまで容量を拡張すれば、この問題を解決できます。単純で強引ながら有効ですが、多くのデータの移動とハッシュ値の計算が必要なため、効率が低すぎます。効率を高めるには、次の戦略を使えます。</p>
<ol>
<li>データ構造を改良して、<strong>ハッシュ衝突が起きても正しく動作できるようにします</strong>。</li>
<li>必要な場合、つまり衝突が多くなった場合だけ容量を拡張します。</li>
</ol>
<p>主な構造の改良方法には、「チェイン法」と「オープンアドレス法」があります。</p>
<h2 id="621">6.2.1   チェイン法<a class="headerlink" href="#621" title="この見出しへのリンク"></a></h2>
<p>元のハッシュテーブルでは、各バケットに一つのペアしか格納できません。<u>チェイン法(separate chaining)</u>では、単一の要素を連結リストに置き換え、キーと値のペアをノードとして、衝突したペアをすべて同じリストに格納します。図 6-5 にその例を示します。</p>
<p><ha-svg-figure class="animation-figure" data-book-key="ja/chapter_hashing/hash_collision.assets/hash_table_chaining.png" data-dark-src="/assets/figure-svg/figures/6382dd27c53355988c5a88e8.json" data-src="/assets/figure-svg/figures/27d5c4ed4ca60fdd5eee6db0.json" style=";--figure-ratio:960.0/540.0"><object data="/ja/chapter_hashing/hash_collision.assets/hash_table_chaining.svg" data-theme="light" tabindex="-1" type="image/svg+xml">チェイン法のハッシュテーブル</object><object data="/ja/chapter_hashing/hash_collision.assets/hash_table_chaining.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">チェイン法のハッシュテーブル</object></ha-svg-figure></p>
<p align="center"> 図 6-5   チェイン法のハッシュテーブル </p>
<p>チェイン法では、操作が次のように変わります。</p>
<ul>
<li><strong>要素の照会</strong>:<code>key</code> を入力し、ハッシュ関数でバケットのインデックスを求め、リストの先頭ノードにアクセスします。その後、リストを走査して <code>key</code> を比較し、目的のペアを探します。</li>
<li><strong>要素の追加</strong>:ハッシュ関数でリストの先頭ノードにアクセスし、ノード、つまりキーと値のペアをリストに追加します。</li>
<li><strong>要素の削除</strong>:ハッシュ関数の結果に基づいてリストの先頭にアクセスし、走査して目的のノードを見つけ、削除します。</li>
</ul>
<p>チェイン法には、次の制約があります。</p>
<ul>
<li><strong>使用領域が増える</strong>:連結リストはノードのポインタを含むため、配列よりメモリを多く使います。</li>
<li><strong>照会の効率が下がる</strong>:目的の要素を探すために、リストを線形に走査する必要があります。</li>
</ul>
<p>以下は単純な実装です。次の二点に注意してください。</p>
<ul>
<li>コードを簡単にするため、連結リストの代わりにリスト(動的配列)を使います。この場合、ハッシュテーブルの配列は複数のバケットを持ち、各バケットが一つのリストになります。</li>
<li>容量拡張の処理も含めています。負荷率が <span class="arithmatex">\(\frac{2}{3}\)</span> を超えると、容量を元の <span class="arithmatex">\(2\)</span> 倍にします。</li>
</ul>
<div class="tabbed-set tabbed-alternate" data-tabs="1:13"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio"/><input id="__tabbed_1_2" name="__tabbed_1" type="radio"/><input id="__tabbed_1_3" name="__tabbed_1" type="radio"/><input id="__tabbed_1_4" name="__tabbed_1" type="radio"/><input id="__tabbed_1_5" name="__tabbed_1" type="radio"/><input id="__tabbed_1_6" name="__tabbed_1" type="radio"/><input id="__tabbed_1_7" name="__tabbed_1" type="radio"/><input id="__tabbed_1_8" name="__tabbed_1" type="radio"/><input id="__tabbed_1_9" name="__tabbed_1" type="radio"/><input id="__tabbed_1_10" name="__tabbed_1" type="radio"/><input id="__tabbed_1_11" name="__tabbed_1" type="radio"/><input id="__tabbed_1_12" name="__tabbed_1" type="radio"/><input id="__tabbed_1_13" name="__tabbed_1" type="radio"/><div class="tabbed-labels"><label for="__tabbed_1_1">Python</label><label for="__tabbed_1_2">C++</label><label for="__tabbed_1_3">Java</label><label for="__tabbed_1_4">C#</label><label for="__tabbed_1_5">Go</label><label for="__tabbed_1_6">Swift</label><label for="__tabbed_1_7">JS</label><label for="__tabbed_1_8">TS</label><label for="__tabbed_1_9">Dart</label><label for="__tabbed_1_10">Rust</label><label for="__tabbed_1_11">C</label><label for="__tabbed_1_12">Kotlin</label><label for="__tabbed_1_13">Ruby</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.py</span><pre><span></span><code><a href="#__codelineno-0-1" id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="k">class</span><span class="w"> </span><span class="nc">HashMapChaining</span><span class="p">:</span>
<a href="#__codelineno-0-2" id="__codelineno-0-2" name="__codelineno-0-2"></a><span class="w"> </span><span class="sd">"""チェイン法のハッシュテーブル"""</span>
<a href="#__codelineno-0-3" id="__codelineno-0-3" name="__codelineno-0-3"></a>
<a href="#__codelineno-0-4" id="__codelineno-0-4" name="__codelineno-0-4"></a> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<a href="#__codelineno-0-5" id="__codelineno-0-5" name="__codelineno-0-5"></a><span class="w"> </span><span class="sd">"""コンストラクタ"""</span>
<a href="#__codelineno-0-6" id="__codelineno-0-6" name="__codelineno-0-6"></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># キーと値のペアの数</span>
<a href="#__codelineno-0-7" id="__codelineno-0-7" name="__codelineno-0-7"></a> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span> <span class="o">=</span> <span class="mi">4</span> <span class="c1"># ハッシュテーブルの容量</span>
<a href="#__codelineno-0-8" id="__codelineno-0-8" name="__codelineno-0-8"></a> <span class="bp">self</span><span class="o">.</span><span class="n">load_thres</span> <span class="o">=</span> <span class="mf">2.0</span> <span class="o">/</span> <span class="mf">3.0</span> <span class="c1"># 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-0-9" id="__codelineno-0-9" name="__codelineno-0-9"></a> <span class="bp">self</span><span class="o">.</span><span class="n">extend_ratio</span> <span class="o">=</span> <span class="mi">2</span> <span class="c1"># 容量の拡張倍率</span>
<a href="#__codelineno-0-10" id="__codelineno-0-10" name="__codelineno-0-10"></a> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span> <span class="o">=</span> <span class="p">[[]</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">capacity</span><span class="p">)]</span> <span class="c1"># バケット配列</span>
<a href="#__codelineno-0-11" id="__codelineno-0-11" name="__codelineno-0-11"></a>
<a href="#__codelineno-0-12" id="__codelineno-0-12" name="__codelineno-0-12"></a> <span class="k">def</span><span class="w"> </span><span class="nf">hash_func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a href="#__codelineno-0-13" id="__codelineno-0-13" name="__codelineno-0-13"></a><span class="w"> </span><span class="sd">"""ハッシュ関数"""</span>
<a href="#__codelineno-0-14" id="__codelineno-0-14" name="__codelineno-0-14"></a> <span class="k">return</span> <span class="n">key</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span>
<a href="#__codelineno-0-15" id="__codelineno-0-15" name="__codelineno-0-15"></a>
<a href="#__codelineno-0-16" id="__codelineno-0-16" name="__codelineno-0-16"></a> <span class="k">def</span><span class="w"> </span><span class="nf">load_factor</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
<a href="#__codelineno-0-17" id="__codelineno-0-17" name="__codelineno-0-17"></a><span class="w"> </span><span class="sd">"""負荷率"""</span>
<a href="#__codelineno-0-18" id="__codelineno-0-18" name="__codelineno-0-18"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span>
<a href="#__codelineno-0-19" id="__codelineno-0-19" name="__codelineno-0-19"></a>
<a href="#__codelineno-0-20" id="__codelineno-0-20" name="__codelineno-0-20"></a> <span class="k">def</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
<a href="#__codelineno-0-21" id="__codelineno-0-21" name="__codelineno-0-21"></a><span class="w"> </span><span class="sd">"""取得操作"""</span>
<a href="#__codelineno-0-22" id="__codelineno-0-22" name="__codelineno-0-22"></a> <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-0-23" id="__codelineno-0-23" name="__codelineno-0-23"></a> <span class="n">bucket</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<a href="#__codelineno-0-24" id="__codelineno-0-24" name="__codelineno-0-24"></a> <span class="c1"># バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-0-25" id="__codelineno-0-25" name="__codelineno-0-25"></a> <span class="k">for</span> <span class="n">pair</span> <span class="ow">in</span> <span class="n">bucket</span><span class="p">:</span>
<a href="#__codelineno-0-26" id="__codelineno-0-26" name="__codelineno-0-26"></a> <span class="k">if</span> <span class="n">pair</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="n">key</span><span class="p">:</span>
<a href="#__codelineno-0-27" id="__codelineno-0-27" name="__codelineno-0-27"></a> <span class="k">return</span> <span class="n">pair</span><span class="o">.</span><span class="n">val</span>
<a href="#__codelineno-0-28" id="__codelineno-0-28" name="__codelineno-0-28"></a> <span class="c1"># key が見つからなかった場合、None を返す</span>
<a href="#__codelineno-0-29" id="__codelineno-0-29" name="__codelineno-0-29"></a> <span class="k">return</span> <span class="kc">None</span>
<a href="#__codelineno-0-30" id="__codelineno-0-30" name="__codelineno-0-30"></a>
<a href="#__codelineno-0-31" id="__codelineno-0-31" name="__codelineno-0-31"></a> <span class="k">def</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<a href="#__codelineno-0-32" id="__codelineno-0-32" name="__codelineno-0-32"></a><span class="w"> </span><span class="sd">"""追加操作"""</span>
<a href="#__codelineno-0-33" id="__codelineno-0-33" name="__codelineno-0-33"></a> <span class="c1"># 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-0-34" id="__codelineno-0-34" name="__codelineno-0-34"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_factor</span><span class="p">()</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_thres</span><span class="p">:</span>
<a href="#__codelineno-0-35" id="__codelineno-0-35" name="__codelineno-0-35"></a> <span class="bp">self</span><span class="o">.</span><span class="n">extend</span><span class="p">()</span>
<a href="#__codelineno-0-36" id="__codelineno-0-36" name="__codelineno-0-36"></a> <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-0-37" id="__codelineno-0-37" name="__codelineno-0-37"></a> <span class="n">bucket</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<a href="#__codelineno-0-38" id="__codelineno-0-38" name="__codelineno-0-38"></a> <span class="c1"># バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-0-39" id="__codelineno-0-39" name="__codelineno-0-39"></a> <span class="k">for</span> <span class="n">pair</span> <span class="ow">in</span> <span class="n">bucket</span><span class="p">:</span>
<a href="#__codelineno-0-40" id="__codelineno-0-40" name="__codelineno-0-40"></a> <span class="k">if</span> <span class="n">pair</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="n">key</span><span class="p">:</span>
<a href="#__codelineno-0-41" id="__codelineno-0-41" name="__codelineno-0-41"></a> <span class="n">pair</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="n">val</span>
<a href="#__codelineno-0-42" id="__codelineno-0-42" name="__codelineno-0-42"></a> <span class="k">return</span>
<a href="#__codelineno-0-43" id="__codelineno-0-43" name="__codelineno-0-43"></a> <span class="c1"># key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-0-44" id="__codelineno-0-44" name="__codelineno-0-44"></a> <span class="n">pair</span> <span class="o">=</span> <span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-0-45" id="__codelineno-0-45" name="__codelineno-0-45"></a> <span class="n">bucket</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pair</span><span class="p">)</span>
<a href="#__codelineno-0-46" id="__codelineno-0-46" name="__codelineno-0-46"></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">+=</span> <span class="mi">1</span>
<a href="#__codelineno-0-47" id="__codelineno-0-47" name="__codelineno-0-47"></a>
<a href="#__codelineno-0-48" id="__codelineno-0-48" name="__codelineno-0-48"></a> <span class="k">def</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
<a href="#__codelineno-0-49" id="__codelineno-0-49" name="__codelineno-0-49"></a><span class="w"> </span><span class="sd">"""削除操作"""</span>
<a href="#__codelineno-0-50" id="__codelineno-0-50" name="__codelineno-0-50"></a> <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-0-51" id="__codelineno-0-51" name="__codelineno-0-51"></a> <span class="n">bucket</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<a href="#__codelineno-0-52" id="__codelineno-0-52" name="__codelineno-0-52"></a> <span class="c1"># バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-0-53" id="__codelineno-0-53" name="__codelineno-0-53"></a> <span class="k">for</span> <span class="n">pair</span> <span class="ow">in</span> <span class="n">bucket</span><span class="p">:</span>
<a href="#__codelineno-0-54" id="__codelineno-0-54" name="__codelineno-0-54"></a> <span class="k">if</span> <span class="n">pair</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="n">key</span><span class="p">:</span>
<a href="#__codelineno-0-55" id="__codelineno-0-55" name="__codelineno-0-55"></a> <span class="n">bucket</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">pair</span><span class="p">)</span>
<a href="#__codelineno-0-56" id="__codelineno-0-56" name="__codelineno-0-56"></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">-=</span> <span class="mi">1</span>
<a href="#__codelineno-0-57" id="__codelineno-0-57" name="__codelineno-0-57"></a> <span class="k">break</span>
<a href="#__codelineno-0-58" id="__codelineno-0-58" name="__codelineno-0-58"></a>
<a href="#__codelineno-0-59" id="__codelineno-0-59" name="__codelineno-0-59"></a> <span class="k">def</span><span class="w"> </span><span class="nf">extend</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<a href="#__codelineno-0-60" id="__codelineno-0-60" name="__codelineno-0-60"></a><span class="w"> </span><span class="sd">"""ハッシュテーブルの容量を拡張する"""</span>
<a href="#__codelineno-0-61" id="__codelineno-0-61" name="__codelineno-0-61"></a> <span class="c1"># 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-0-62" id="__codelineno-0-62" name="__codelineno-0-62"></a> <span class="n">buckets</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span>
<a href="#__codelineno-0-63" id="__codelineno-0-63" name="__codelineno-0-63"></a> <span class="c1"># 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-0-64" id="__codelineno-0-64" name="__codelineno-0-64"></a> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span> <span class="o">*=</span> <span class="bp">self</span><span class="o">.</span><span class="n">extend_ratio</span>
<a href="#__codelineno-0-65" id="__codelineno-0-65" name="__codelineno-0-65"></a> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span> <span class="o">=</span> <span class="p">[[]</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">capacity</span><span class="p">)]</span>
<a href="#__codelineno-0-66" id="__codelineno-0-66" name="__codelineno-0-66"></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="mi">0</span>
<a href="#__codelineno-0-67" id="__codelineno-0-67" name="__codelineno-0-67"></a> <span class="c1"># キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-0-68" id="__codelineno-0-68" name="__codelineno-0-68"></a> <span class="k">for</span> <span class="n">bucket</span> <span class="ow">in</span> <span class="n">buckets</span><span class="p">:</span>
<a href="#__codelineno-0-69" id="__codelineno-0-69" name="__codelineno-0-69"></a> <span class="k">for</span> <span class="n">pair</span> <span class="ow">in</span> <span class="n">bucket</span><span class="p">:</span>
<a href="#__codelineno-0-70" id="__codelineno-0-70" name="__codelineno-0-70"></a> <span class="bp">self</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">pair</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-0-71" id="__codelineno-0-71" name="__codelineno-0-71"></a>
<a href="#__codelineno-0-72" id="__codelineno-0-72" name="__codelineno-0-72"></a> <span class="k">def</span><span class="w"> </span><span class="nf">print</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<a href="#__codelineno-0-73" id="__codelineno-0-73" name="__codelineno-0-73"></a><span class="w"> </span><span class="sd">"""ハッシュテーブルを表示する"""</span>
<a href="#__codelineno-0-74" id="__codelineno-0-74" name="__codelineno-0-74"></a> <span class="k">for</span> <span class="n">bucket</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">:</span>
<a href="#__codelineno-0-75" id="__codelineno-0-75" name="__codelineno-0-75"></a> <span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
<a href="#__codelineno-0-76" id="__codelineno-0-76" name="__codelineno-0-76"></a> <span class="k">for</span> <span class="n">pair</span> <span class="ow">in</span> <span class="n">bucket</span><span class="p">:</span>
<a href="#__codelineno-0-77" id="__codelineno-0-77" name="__codelineno-0-77"></a> <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="p">)</span> <span class="o">+</span> <span class="s2">" -&gt; "</span> <span class="o">+</span> <span class="n">pair</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-0-78" id="__codelineno-0-78" name="__codelineno-0-78"></a> <span class="nb">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.cpp</span><pre><span></span><code><a href="#__codelineno-1-1" id="__codelineno-1-1" name="__codelineno-1-1"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-1-2" id="__codelineno-1-2" name="__codelineno-1-2"></a><span class="k">class</span><span class="w"> </span><span class="nc">HashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-3" id="__codelineno-1-3" name="__codelineno-1-3"></a><span class="w"> </span><span class="k">private</span><span class="o">:</span>
<a href="#__codelineno-1-4" id="__codelineno-1-4" name="__codelineno-1-4"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-1-5" id="__codelineno-1-5" name="__codelineno-1-5"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-1-6" id="__codelineno-1-6" name="__codelineno-1-6"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadThres</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-1-7" id="__codelineno-1-7" name="__codelineno-1-7"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-1-8" id="__codelineno-1-8" name="__codelineno-1-8"></a><span class="w"> </span><span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">Pair</span><span class="w"> </span><span class="o">*&gt;&gt;</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-1-9" id="__codelineno-1-9" name="__codelineno-1-9"></a>
<a href="#__codelineno-1-10" id="__codelineno-1-10" name="__codelineno-1-10"></a><span class="w"> </span><span class="k">public</span><span class="o">:</span>
<a href="#__codelineno-1-11" id="__codelineno-1-11" name="__codelineno-1-11"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-1-12" id="__codelineno-1-12" name="__codelineno-1-12"></a><span class="w"> </span><span class="n">HashMapChaining</span><span class="p">()</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">size</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span><span class="w"> </span><span class="n">capacity</span><span class="p">(</span><span class="mi">4</span><span class="p">),</span><span class="w"> </span><span class="n">loadThres</span><span class="p">(</span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">),</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-13" id="__codelineno-1-13" name="__codelineno-1-13"></a><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">capacity</span><span class="p">);</span>
<a href="#__codelineno-1-14" id="__codelineno-1-14" name="__codelineno-1-14"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-15" id="__codelineno-1-15" name="__codelineno-1-15"></a>
<a href="#__codelineno-1-16" id="__codelineno-1-16" name="__codelineno-1-16"></a><span class="w"> </span><span class="cm">/* デストラクタ */</span>
<a href="#__codelineno-1-17" id="__codelineno-1-17" name="__codelineno-1-17"></a><span class="w"> </span><span class="o">~</span><span class="n">HashMapChaining</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-18" id="__codelineno-1-18" name="__codelineno-1-18"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="o">&amp;</span><span class="n">bucket</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-19" id="__codelineno-1-19" name="__codelineno-1-19"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-20" id="__codelineno-1-20" name="__codelineno-1-20"></a><span class="w"> </span><span class="c1">// メモリを解放する</span>
<a href="#__codelineno-1-21" id="__codelineno-1-21" name="__codelineno-1-21"></a><span class="w"> </span><span class="k">delete</span><span class="w"> </span><span class="n">pair</span><span class="p">;</span>
<a href="#__codelineno-1-22" id="__codelineno-1-22" name="__codelineno-1-22"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-23" id="__codelineno-1-23" name="__codelineno-1-23"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-24" id="__codelineno-1-24" name="__codelineno-1-24"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-25" id="__codelineno-1-25" name="__codelineno-1-25"></a>
<a href="#__codelineno-1-26" id="__codelineno-1-26" name="__codelineno-1-26"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-1-27" id="__codelineno-1-27" name="__codelineno-1-27"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-28" id="__codelineno-1-28" name="__codelineno-1-28"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-1-29" id="__codelineno-1-29" name="__codelineno-1-29"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-30" id="__codelineno-1-30" name="__codelineno-1-30"></a>
<a href="#__codelineno-1-31" id="__codelineno-1-31" name="__codelineno-1-31"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-1-32" id="__codelineno-1-32" name="__codelineno-1-32"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-33" id="__codelineno-1-33" name="__codelineno-1-33"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-1-34" id="__codelineno-1-34" name="__codelineno-1-34"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-35" id="__codelineno-1-35" name="__codelineno-1-35"></a>
<a href="#__codelineno-1-36" id="__codelineno-1-36" name="__codelineno-1-36"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-1-37" id="__codelineno-1-37" name="__codelineno-1-37"></a><span class="w"> </span><span class="n">string</span><span class="w"> </span><span class="n">get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-38" id="__codelineno-1-38" name="__codelineno-1-38"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-1-39" id="__codelineno-1-39" name="__codelineno-1-39"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-1-40" id="__codelineno-1-40" name="__codelineno-1-40"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-41" id="__codelineno-1-41" name="__codelineno-1-41"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-42" id="__codelineno-1-42" name="__codelineno-1-42"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-1-43" id="__codelineno-1-43" name="__codelineno-1-43"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-44" id="__codelineno-1-44" name="__codelineno-1-44"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-45" id="__codelineno-1-45" name="__codelineno-1-45"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、空文字列を返す</span>
<a href="#__codelineno-1-46" id="__codelineno-1-46" name="__codelineno-1-46"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s">""</span><span class="p">;</span>
<a href="#__codelineno-1-47" id="__codelineno-1-47" name="__codelineno-1-47"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-48" id="__codelineno-1-48" name="__codelineno-1-48"></a>
<a href="#__codelineno-1-49" id="__codelineno-1-49" name="__codelineno-1-49"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-1-50" id="__codelineno-1-50" name="__codelineno-1-50"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">string</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-51" id="__codelineno-1-51" name="__codelineno-1-51"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-1-52" id="__codelineno-1-52" name="__codelineno-1-52"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-53" id="__codelineno-1-53" name="__codelineno-1-53"></a><span class="w"> </span><span class="n">extend</span><span class="p">();</span>
<a href="#__codelineno-1-54" id="__codelineno-1-54" name="__codelineno-1-54"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-55" id="__codelineno-1-55" name="__codelineno-1-55"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-1-56" id="__codelineno-1-56" name="__codelineno-1-56"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-1-57" id="__codelineno-1-57" name="__codelineno-1-57"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-58" id="__codelineno-1-58" name="__codelineno-1-58"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-59" id="__codelineno-1-59" name="__codelineno-1-59"></a><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-1-60" id="__codelineno-1-60" name="__codelineno-1-60"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-1-61" id="__codelineno-1-61" name="__codelineno-1-61"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-62" id="__codelineno-1-62" name="__codelineno-1-62"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-63" id="__codelineno-1-63" name="__codelineno-1-63"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-1-64" id="__codelineno-1-64" name="__codelineno-1-64"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">));</span>
<a href="#__codelineno-1-65" id="__codelineno-1-65" name="__codelineno-1-65"></a><span class="w"> </span><span class="n">size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-1-66" id="__codelineno-1-66" name="__codelineno-1-66"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-67" id="__codelineno-1-67" name="__codelineno-1-67"></a>
<a href="#__codelineno-1-68" id="__codelineno-1-68" name="__codelineno-1-68"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-1-69" id="__codelineno-1-69" name="__codelineno-1-69"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">remove</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-70" id="__codelineno-1-70" name="__codelineno-1-70"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-1-71" id="__codelineno-1-71" name="__codelineno-1-71"></a><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="o">&amp;</span><span class="n">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-1-72" id="__codelineno-1-72" name="__codelineno-1-72"></a><span class="w"> </span><span class="c1">// バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-1-73" id="__codelineno-1-73" name="__codelineno-1-73"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">bucket</span><span class="p">.</span><span class="n">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-74" id="__codelineno-1-74" name="__codelineno-1-74"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">bucket</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-75" id="__codelineno-1-75" name="__codelineno-1-75"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">tmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bucket</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<a href="#__codelineno-1-76" id="__codelineno-1-76" name="__codelineno-1-76"></a><span class="w"> </span><span class="n">bucket</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">bucket</span><span class="p">.</span><span class="n">begin</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">i</span><span class="p">);</span><span class="w"> </span><span class="c1">// キーと値のペアを削除する</span>
<a href="#__codelineno-1-77" id="__codelineno-1-77" name="__codelineno-1-77"></a><span class="w"> </span><span class="k">delete</span><span class="w"> </span><span class="n">tmp</span><span class="p">;</span><span class="w"> </span><span class="c1">// メモリを解放する</span>
<a href="#__codelineno-1-78" id="__codelineno-1-78" name="__codelineno-1-78"></a><span class="w"> </span><span class="n">size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-1-79" id="__codelineno-1-79" name="__codelineno-1-79"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-1-80" id="__codelineno-1-80" name="__codelineno-1-80"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-81" id="__codelineno-1-81" name="__codelineno-1-81"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-82" id="__codelineno-1-82" name="__codelineno-1-82"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-83" id="__codelineno-1-83" name="__codelineno-1-83"></a>
<a href="#__codelineno-1-84" id="__codelineno-1-84" name="__codelineno-1-84"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-1-85" id="__codelineno-1-85" name="__codelineno-1-85"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-86" id="__codelineno-1-86" name="__codelineno-1-86"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-1-87" id="__codelineno-1-87" name="__codelineno-1-87"></a><span class="w"> </span><span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">Pair</span><span class="w"> </span><span class="o">*&gt;&gt;</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span>
<a href="#__codelineno-1-88" id="__codelineno-1-88" name="__codelineno-1-88"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-1-89" id="__codelineno-1-89" name="__codelineno-1-89"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span>
<a href="#__codelineno-1-90" id="__codelineno-1-90" name="__codelineno-1-90"></a><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
<a href="#__codelineno-1-91" id="__codelineno-1-91" name="__codelineno-1-91"></a><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">capacity</span><span class="p">);</span>
<a href="#__codelineno-1-92" id="__codelineno-1-92" name="__codelineno-1-92"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-1-93" id="__codelineno-1-93" name="__codelineno-1-93"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-1-94" id="__codelineno-1-94" name="__codelineno-1-94"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="o">&amp;</span><span class="n">bucket</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-95" id="__codelineno-1-95" name="__codelineno-1-95"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-96" id="__codelineno-1-96" name="__codelineno-1-96"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-1-97" id="__codelineno-1-97" name="__codelineno-1-97"></a><span class="w"> </span><span class="c1">// メモリを解放する</span>
<a href="#__codelineno-1-98" id="__codelineno-1-98" name="__codelineno-1-98"></a><span class="w"> </span><span class="k">delete</span><span class="w"> </span><span class="n">pair</span><span class="p">;</span>
<a href="#__codelineno-1-99" id="__codelineno-1-99" name="__codelineno-1-99"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-100" id="__codelineno-1-100" name="__codelineno-1-100"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-101" id="__codelineno-1-101" name="__codelineno-1-101"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-102" id="__codelineno-1-102" name="__codelineno-1-102"></a>
<a href="#__codelineno-1-103" id="__codelineno-1-103" name="__codelineno-1-103"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-1-104" id="__codelineno-1-104" name="__codelineno-1-104"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-105" id="__codelineno-1-105" name="__codelineno-1-105"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="k">auto</span><span class="w"> </span><span class="o">&amp;</span><span class="n">bucket</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-106" id="__codelineno-1-106" name="__codelineno-1-106"></a><span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">"["</span><span class="p">;</span>
<a href="#__codelineno-1-107" id="__codelineno-1-107" name="__codelineno-1-107"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-1-108" id="__codelineno-1-108" name="__codelineno-1-108"></a><span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">" -&gt; "</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">", "</span><span class="p">;</span>
<a href="#__codelineno-1-109" id="__codelineno-1-109" name="__codelineno-1-109"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-110" id="__codelineno-1-110" name="__codelineno-1-110"></a><span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">"]</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<a href="#__codelineno-1-111" id="__codelineno-1-111" name="__codelineno-1-111"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-112" id="__codelineno-1-112" name="__codelineno-1-112"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-1-113" id="__codelineno-1-113" name="__codelineno-1-113"></a><span class="p">};</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.java</span><pre><span></span><code><a href="#__codelineno-2-1" id="__codelineno-2-1" name="__codelineno-2-1"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-2-2" id="__codelineno-2-2" name="__codelineno-2-2"></a><span class="kd">class</span> <span class="nc">HashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-3" id="__codelineno-2-3" name="__codelineno-2-3"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-2-4" id="__codelineno-2-4" name="__codelineno-2-4"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-2-5" id="__codelineno-2-5" name="__codelineno-2-5"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadThres</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-2-6" id="__codelineno-2-6" name="__codelineno-2-6"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-2-7" id="__codelineno-2-7" name="__codelineno-2-7"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-2-8" id="__codelineno-2-8" name="__codelineno-2-8"></a>
<a href="#__codelineno-2-9" id="__codelineno-2-9" name="__codelineno-2-9"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-2-10" id="__codelineno-2-10" name="__codelineno-2-10"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="nf">HashMapChaining</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-11" id="__codelineno-2-11" name="__codelineno-2-11"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-2-12" id="__codelineno-2-12" name="__codelineno-2-12"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span>
<a href="#__codelineno-2-13" id="__codelineno-2-13" name="__codelineno-2-13"></a><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span>
<a href="#__codelineno-2-14" id="__codelineno-2-14" name="__codelineno-2-14"></a><span class="w"> </span><span class="n">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span>
<a href="#__codelineno-2-15" id="__codelineno-2-15" name="__codelineno-2-15"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o">&lt;&gt;</span><span class="p">(</span><span class="n">capacity</span><span class="p">);</span>
<a href="#__codelineno-2-16" id="__codelineno-2-16" name="__codelineno-2-16"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-17" id="__codelineno-2-17" name="__codelineno-2-17"></a><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o">&lt;&gt;</span><span class="p">());</span>
<a href="#__codelineno-2-18" id="__codelineno-2-18" name="__codelineno-2-18"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-19" id="__codelineno-2-19" name="__codelineno-2-19"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-20" id="__codelineno-2-20" name="__codelineno-2-20"></a>
<a href="#__codelineno-2-21" id="__codelineno-2-21" name="__codelineno-2-21"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-2-22" id="__codelineno-2-22" name="__codelineno-2-22"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">hashFunc</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-23" id="__codelineno-2-23" name="__codelineno-2-23"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-2-24" id="__codelineno-2-24" name="__codelineno-2-24"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-25" id="__codelineno-2-25" name="__codelineno-2-25"></a>
<a href="#__codelineno-2-26" id="__codelineno-2-26" name="__codelineno-2-26"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-2-27" id="__codelineno-2-27" name="__codelineno-2-27"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="nf">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-28" id="__codelineno-2-28" name="__codelineno-2-28"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-2-29" id="__codelineno-2-29" name="__codelineno-2-29"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-30" id="__codelineno-2-30" name="__codelineno-2-30"></a>
<a href="#__codelineno-2-31" id="__codelineno-2-31" name="__codelineno-2-31"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-2-32" id="__codelineno-2-32" name="__codelineno-2-32"></a><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-33" id="__codelineno-2-33" name="__codelineno-2-33"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-2-34" id="__codelineno-2-34" name="__codelineno-2-34"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="n">index</span><span class="p">);</span>
<a href="#__codelineno-2-35" id="__codelineno-2-35" name="__codelineno-2-35"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-2-36" id="__codelineno-2-36" name="__codelineno-2-36"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-37" id="__codelineno-2-37" name="__codelineno-2-37"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-38" id="__codelineno-2-38" name="__codelineno-2-38"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">val</span><span class="p">;</span>
<a href="#__codelineno-2-39" id="__codelineno-2-39" name="__codelineno-2-39"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-40" id="__codelineno-2-40" name="__codelineno-2-40"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-41" id="__codelineno-2-41" name="__codelineno-2-41"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、null を返す</span>
<a href="#__codelineno-2-42" id="__codelineno-2-42" name="__codelineno-2-42"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<a href="#__codelineno-2-43" id="__codelineno-2-43" name="__codelineno-2-43"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-44" id="__codelineno-2-44" name="__codelineno-2-44"></a>
<a href="#__codelineno-2-45" id="__codelineno-2-45" name="__codelineno-2-45"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-2-46" id="__codelineno-2-46" name="__codelineno-2-46"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-47" id="__codelineno-2-47" name="__codelineno-2-47"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-2-48" id="__codelineno-2-48" name="__codelineno-2-48"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-49" id="__codelineno-2-49" name="__codelineno-2-49"></a><span class="w"> </span><span class="n">extend</span><span class="p">();</span>
<a href="#__codelineno-2-50" id="__codelineno-2-50" name="__codelineno-2-50"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-51" id="__codelineno-2-51" name="__codelineno-2-51"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-2-52" id="__codelineno-2-52" name="__codelineno-2-52"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="n">index</span><span class="p">);</span>
<a href="#__codelineno-2-53" id="__codelineno-2-53" name="__codelineno-2-53"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-2-54" id="__codelineno-2-54" name="__codelineno-2-54"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-55" id="__codelineno-2-55" name="__codelineno-2-55"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-56" id="__codelineno-2-56" name="__codelineno-2-56"></a><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-2-57" id="__codelineno-2-57" name="__codelineno-2-57"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-2-58" id="__codelineno-2-58" name="__codelineno-2-58"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-59" id="__codelineno-2-59" name="__codelineno-2-59"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-60" id="__codelineno-2-60" name="__codelineno-2-60"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-2-61" id="__codelineno-2-61" name="__codelineno-2-61"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-2-62" id="__codelineno-2-62" name="__codelineno-2-62"></a><span class="w"> </span><span class="n">bucket</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-2-63" id="__codelineno-2-63" name="__codelineno-2-63"></a><span class="w"> </span><span class="n">size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-2-64" id="__codelineno-2-64" name="__codelineno-2-64"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-65" id="__codelineno-2-65" name="__codelineno-2-65"></a>
<a href="#__codelineno-2-66" id="__codelineno-2-66" name="__codelineno-2-66"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-2-67" id="__codelineno-2-67" name="__codelineno-2-67"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-68" id="__codelineno-2-68" name="__codelineno-2-68"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-2-69" id="__codelineno-2-69" name="__codelineno-2-69"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="n">index</span><span class="p">);</span>
<a href="#__codelineno-2-70" id="__codelineno-2-70" name="__codelineno-2-70"></a><span class="w"> </span><span class="c1">// バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-2-71" id="__codelineno-2-71" name="__codelineno-2-71"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-72" id="__codelineno-2-72" name="__codelineno-2-72"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-73" id="__codelineno-2-73" name="__codelineno-2-73"></a><span class="w"> </span><span class="n">bucket</span><span class="p">.</span><span class="na">remove</span><span class="p">(</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-2-74" id="__codelineno-2-74" name="__codelineno-2-74"></a><span class="w"> </span><span class="n">size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-2-75" id="__codelineno-2-75" name="__codelineno-2-75"></a><span class="w"> </span><span class="k">break</span><span class="p">;</span>
<a href="#__codelineno-2-76" id="__codelineno-2-76" name="__codelineno-2-76"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-77" id="__codelineno-2-77" name="__codelineno-2-77"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-78" id="__codelineno-2-78" name="__codelineno-2-78"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-79" id="__codelineno-2-79" name="__codelineno-2-79"></a>
<a href="#__codelineno-2-80" id="__codelineno-2-80" name="__codelineno-2-80"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-2-81" id="__codelineno-2-81" name="__codelineno-2-81"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-82" id="__codelineno-2-82" name="__codelineno-2-82"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-2-83" id="__codelineno-2-83" name="__codelineno-2-83"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span>
<a href="#__codelineno-2-84" id="__codelineno-2-84" name="__codelineno-2-84"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-2-85" id="__codelineno-2-85" name="__codelineno-2-85"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span>
<a href="#__codelineno-2-86" id="__codelineno-2-86" name="__codelineno-2-86"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o">&lt;&gt;</span><span class="p">(</span><span class="n">capacity</span><span class="p">);</span>
<a href="#__codelineno-2-87" id="__codelineno-2-87" name="__codelineno-2-87"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-88" id="__codelineno-2-88" name="__codelineno-2-88"></a><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o">&lt;&gt;</span><span class="p">());</span>
<a href="#__codelineno-2-89" id="__codelineno-2-89" name="__codelineno-2-89"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-90" id="__codelineno-2-90" name="__codelineno-2-90"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-2-91" id="__codelineno-2-91" name="__codelineno-2-91"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-2-92" id="__codelineno-2-92" name="__codelineno-2-92"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-93" id="__codelineno-2-93" name="__codelineno-2-93"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-94" id="__codelineno-2-94" name="__codelineno-2-94"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">val</span><span class="p">);</span>
<a href="#__codelineno-2-95" id="__codelineno-2-95" name="__codelineno-2-95"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-96" id="__codelineno-2-96" name="__codelineno-2-96"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-97" id="__codelineno-2-97" name="__codelineno-2-97"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-98" id="__codelineno-2-98" name="__codelineno-2-98"></a>
<a href="#__codelineno-2-99" id="__codelineno-2-99" name="__codelineno-2-99"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-2-100" id="__codelineno-2-100" name="__codelineno-2-100"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-101" id="__codelineno-2-101" name="__codelineno-2-101"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-102" id="__codelineno-2-102" name="__codelineno-2-102"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o">&lt;&gt;</span><span class="p">();</span>
<a href="#__codelineno-2-103" id="__codelineno-2-103" name="__codelineno-2-103"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-2-104" id="__codelineno-2-104" name="__codelineno-2-104"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" -&gt; "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">val</span><span class="p">);</span>
<a href="#__codelineno-2-105" id="__codelineno-2-105" name="__codelineno-2-105"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-106" id="__codelineno-2-106" name="__codelineno-2-106"></a><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">res</span><span class="p">);</span>
<a href="#__codelineno-2-107" id="__codelineno-2-107" name="__codelineno-2-107"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-108" id="__codelineno-2-108" name="__codelineno-2-108"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-2-109" id="__codelineno-2-109" name="__codelineno-2-109"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.cs</span><pre><span></span><code><a href="#__codelineno-3-1" id="__codelineno-3-1" name="__codelineno-3-1"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-3-2" id="__codelineno-3-2" name="__codelineno-3-2"></a><span class="k">class</span><span class="w"> </span><span class="nc">HashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-3" id="__codelineno-3-3" name="__codelineno-3-3"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-3-4" id="__codelineno-3-4" name="__codelineno-3-4"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-3-5" id="__codelineno-3-5" name="__codelineno-3-5"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadThres</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-3-6" id="__codelineno-3-6" name="__codelineno-3-6"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-3-7" id="__codelineno-3-7" name="__codelineno-3-7"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-3-8" id="__codelineno-3-8" name="__codelineno-3-8"></a>
<a href="#__codelineno-3-9" id="__codelineno-3-9" name="__codelineno-3-9"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-3-10" id="__codelineno-3-10" name="__codelineno-3-10"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">HashMapChaining</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-11" id="__codelineno-3-11" name="__codelineno-3-11"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-3-12" id="__codelineno-3-12" name="__codelineno-3-12"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span>
<a href="#__codelineno-3-13" id="__codelineno-3-13" name="__codelineno-3-13"></a><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span>
<a href="#__codelineno-3-14" id="__codelineno-3-14" name="__codelineno-3-14"></a><span class="w"> </span><span class="n">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span>
<a href="#__codelineno-3-15" id="__codelineno-3-15" name="__codelineno-3-15"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="p">(</span><span class="n">capacity</span><span class="p">);</span>
<a href="#__codelineno-3-16" id="__codelineno-3-16" name="__codelineno-3-16"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-17" id="__codelineno-3-17" name="__codelineno-3-17"></a><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="n">Add</span><span class="p">([]);</span>
<a href="#__codelineno-3-18" id="__codelineno-3-18" name="__codelineno-3-18"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-19" id="__codelineno-3-19" name="__codelineno-3-19"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-20" id="__codelineno-3-20" name="__codelineno-3-20"></a>
<a href="#__codelineno-3-21" id="__codelineno-3-21" name="__codelineno-3-21"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-3-22" id="__codelineno-3-22" name="__codelineno-3-22"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">HashFunc</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-23" id="__codelineno-3-23" name="__codelineno-3-23"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-3-24" id="__codelineno-3-24" name="__codelineno-3-24"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-25" id="__codelineno-3-25" name="__codelineno-3-25"></a>
<a href="#__codelineno-3-26" id="__codelineno-3-26" name="__codelineno-3-26"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-3-27" id="__codelineno-3-27" name="__codelineno-3-27"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="nf">LoadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-28" id="__codelineno-3-28" name="__codelineno-3-28"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-3-29" id="__codelineno-3-29" name="__codelineno-3-29"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-30" id="__codelineno-3-30" name="__codelineno-3-30"></a>
<a href="#__codelineno-3-31" id="__codelineno-3-31" name="__codelineno-3-31"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-3-32" id="__codelineno-3-32" name="__codelineno-3-32"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">string?</span><span class="w"> </span><span class="n">Get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-33" id="__codelineno-3-33" name="__codelineno-3-33"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-3-34" id="__codelineno-3-34" name="__codelineno-3-34"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-3-35" id="__codelineno-3-35" name="__codelineno-3-35"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-36" id="__codelineno-3-36" name="__codelineno-3-36"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-37" id="__codelineno-3-37" name="__codelineno-3-37"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-3-38" id="__codelineno-3-38" name="__codelineno-3-38"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-39" id="__codelineno-3-39" name="__codelineno-3-39"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-40" id="__codelineno-3-40" name="__codelineno-3-40"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、null を返す</span>
<a href="#__codelineno-3-41" id="__codelineno-3-41" name="__codelineno-3-41"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">null</span><span class="p">;</span>
<a href="#__codelineno-3-42" id="__codelineno-3-42" name="__codelineno-3-42"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-43" id="__codelineno-3-43" name="__codelineno-3-43"></a>
<a href="#__codelineno-3-44" id="__codelineno-3-44" name="__codelineno-3-44"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-3-45" id="__codelineno-3-45" name="__codelineno-3-45"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Put</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-46" id="__codelineno-3-46" name="__codelineno-3-46"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-3-47" id="__codelineno-3-47" name="__codelineno-3-47"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">LoadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-48" id="__codelineno-3-48" name="__codelineno-3-48"></a><span class="w"> </span><span class="n">Extend</span><span class="p">();</span>
<a href="#__codelineno-3-49" id="__codelineno-3-49" name="__codelineno-3-49"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-50" id="__codelineno-3-50" name="__codelineno-3-50"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-3-51" id="__codelineno-3-51" name="__codelineno-3-51"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-3-52" id="__codelineno-3-52" name="__codelineno-3-52"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-53" id="__codelineno-3-53" name="__codelineno-3-53"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-54" id="__codelineno-3-54" name="__codelineno-3-54"></a><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-3-55" id="__codelineno-3-55" name="__codelineno-3-55"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-3-56" id="__codelineno-3-56" name="__codelineno-3-56"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-57" id="__codelineno-3-57" name="__codelineno-3-57"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-58" id="__codelineno-3-58" name="__codelineno-3-58"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-3-59" id="__codelineno-3-59" name="__codelineno-3-59"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">));</span>
<a href="#__codelineno-3-60" id="__codelineno-3-60" name="__codelineno-3-60"></a><span class="w"> </span><span class="n">size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-3-61" id="__codelineno-3-61" name="__codelineno-3-61"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-62" id="__codelineno-3-62" name="__codelineno-3-62"></a>
<a href="#__codelineno-3-63" id="__codelineno-3-63" name="__codelineno-3-63"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-3-64" id="__codelineno-3-64" name="__codelineno-3-64"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Remove</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-65" id="__codelineno-3-65" name="__codelineno-3-65"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-3-66" id="__codelineno-3-66" name="__codelineno-3-66"></a><span class="w"> </span><span class="c1">// バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-3-67" id="__codelineno-3-67" name="__codelineno-3-67"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">ToList</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-68" id="__codelineno-3-68" name="__codelineno-3-68"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-69" id="__codelineno-3-69" name="__codelineno-3-69"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">Remove</span><span class="p">(</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-3-70" id="__codelineno-3-70" name="__codelineno-3-70"></a><span class="w"> </span><span class="n">size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-3-71" id="__codelineno-3-71" name="__codelineno-3-71"></a><span class="w"> </span><span class="k">break</span><span class="p">;</span>
<a href="#__codelineno-3-72" id="__codelineno-3-72" name="__codelineno-3-72"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-73" id="__codelineno-3-73" name="__codelineno-3-73"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-74" id="__codelineno-3-74" name="__codelineno-3-74"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-75" id="__codelineno-3-75" name="__codelineno-3-75"></a>
<a href="#__codelineno-3-76" id="__codelineno-3-76" name="__codelineno-3-76"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-3-77" id="__codelineno-3-77" name="__codelineno-3-77"></a><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-78" id="__codelineno-3-78" name="__codelineno-3-78"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-3-79" id="__codelineno-3-79" name="__codelineno-3-79"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span>
<a href="#__codelineno-3-80" id="__codelineno-3-80" name="__codelineno-3-80"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-3-81" id="__codelineno-3-81" name="__codelineno-3-81"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span>
<a href="#__codelineno-3-82" id="__codelineno-3-82" name="__codelineno-3-82"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="p">(</span><span class="n">capacity</span><span class="p">);</span>
<a href="#__codelineno-3-83" id="__codelineno-3-83" name="__codelineno-3-83"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-84" id="__codelineno-3-84" name="__codelineno-3-84"></a><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="n">Add</span><span class="p">([]);</span>
<a href="#__codelineno-3-85" id="__codelineno-3-85" name="__codelineno-3-85"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-86" id="__codelineno-3-86" name="__codelineno-3-86"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-3-87" id="__codelineno-3-87" name="__codelineno-3-87"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-3-88" id="__codelineno-3-88" name="__codelineno-3-88"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-89" id="__codelineno-3-89" name="__codelineno-3-89"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-90" id="__codelineno-3-90" name="__codelineno-3-90"></a><span class="w"> </span><span class="n">Put</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-3-91" id="__codelineno-3-91" name="__codelineno-3-91"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-92" id="__codelineno-3-92" name="__codelineno-3-92"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-93" id="__codelineno-3-93" name="__codelineno-3-93"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-94" id="__codelineno-3-94" name="__codelineno-3-94"></a>
<a href="#__codelineno-3-95" id="__codelineno-3-95" name="__codelineno-3-95"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-3-96" id="__codelineno-3-96" name="__codelineno-3-96"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-97" id="__codelineno-3-97" name="__codelineno-3-97"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-98" id="__codelineno-3-98" name="__codelineno-3-98"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="kt">string</span><span class="o">&gt;</span><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[];</span>
<a href="#__codelineno-3-99" id="__codelineno-3-99" name="__codelineno-3-99"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-100" id="__codelineno-3-100" name="__codelineno-3-100"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" -&gt; "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-3-101" id="__codelineno-3-101" name="__codelineno-3-101"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-102" id="__codelineno-3-102" name="__codelineno-3-102"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="kt">string</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-3-103" id="__codelineno-3-103" name="__codelineno-3-103"></a><span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">kv</span><span class="p">);</span>
<a href="#__codelineno-3-104" id="__codelineno-3-104" name="__codelineno-3-104"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-105" id="__codelineno-3-105" name="__codelineno-3-105"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-106" id="__codelineno-3-106" name="__codelineno-3-106"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-3-107" id="__codelineno-3-107" name="__codelineno-3-107"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.go</span><pre><span></span><code><a href="#__codelineno-4-1" id="__codelineno-4-1" name="__codelineno-4-1"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-4-2" id="__codelineno-4-2" name="__codelineno-4-2"></a><span class="kd">type</span><span class="w"> </span><span class="nx">hashMapChaining</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-3" id="__codelineno-4-3" name="__codelineno-4-3"></a><span class="w"> </span><span class="nx">size</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-4-4" id="__codelineno-4-4" name="__codelineno-4-4"></a><span class="w"> </span><span class="nx">capacity</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-4-5" id="__codelineno-4-5" name="__codelineno-4-5"></a><span class="w"> </span><span class="nx">loadThres</span><span class="w"> </span><span class="kt">float64</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-4-6" id="__codelineno-4-6" name="__codelineno-4-6"></a><span class="w"> </span><span class="nx">extendRatio</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-4-7" id="__codelineno-4-7" name="__codelineno-4-7"></a><span class="w"> </span><span class="nx">buckets</span><span class="w"> </span><span class="p">[][]</span><span class="nx">pair</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-4-8" id="__codelineno-4-8" name="__codelineno-4-8"></a><span class="p">}</span>
<a href="#__codelineno-4-9" id="__codelineno-4-9" name="__codelineno-4-9"></a>
<a href="#__codelineno-4-10" id="__codelineno-4-10" name="__codelineno-4-10"></a><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-4-11" id="__codelineno-4-11" name="__codelineno-4-11"></a><span class="kd">func</span><span class="w"> </span><span class="nx">newHashMapChaining</span><span class="p">()</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-12" id="__codelineno-4-12" name="__codelineno-4-12"></a><span class="w"> </span><span class="nx">buckets</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">make</span><span class="p">([][]</span><span class="nx">pair</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">)</span>
<a href="#__codelineno-4-13" id="__codelineno-4-13" name="__codelineno-4-13"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="o">++</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-14" id="__codelineno-4-14" name="__codelineno-4-14"></a><span class="w"> </span><span class="nx">buckets</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">make</span><span class="p">([]</span><span class="nx">pair</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<a href="#__codelineno-4-15" id="__codelineno-4-15" name="__codelineno-4-15"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-16" id="__codelineno-4-16" name="__codelineno-4-16"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">hashMapChaining</span><span class="p">{</span>
<a href="#__codelineno-4-17" id="__codelineno-4-17" name="__codelineno-4-17"></a><span class="w"> </span><span class="nx">size</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<a href="#__codelineno-4-18" id="__codelineno-4-18" name="__codelineno-4-18"></a><span class="w"> </span><span class="nx">capacity</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span>
<a href="#__codelineno-4-19" id="__codelineno-4-19" name="__codelineno-4-19"></a><span class="w"> </span><span class="nx">loadThres</span><span class="p">:</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">,</span>
<a href="#__codelineno-4-20" id="__codelineno-4-20" name="__codelineno-4-20"></a><span class="w"> </span><span class="nx">extendRatio</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<a href="#__codelineno-4-21" id="__codelineno-4-21" name="__codelineno-4-21"></a><span class="w"> </span><span class="nx">buckets</span><span class="p">:</span><span class="w"> </span><span class="nx">buckets</span><span class="p">,</span>
<a href="#__codelineno-4-22" id="__codelineno-4-22" name="__codelineno-4-22"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-23" id="__codelineno-4-23" name="__codelineno-4-23"></a><span class="p">}</span>
<a href="#__codelineno-4-24" id="__codelineno-4-24" name="__codelineno-4-24"></a>
<a href="#__codelineno-4-25" id="__codelineno-4-25" name="__codelineno-4-25"></a><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-4-26" id="__codelineno-4-26" name="__codelineno-4-26"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">m</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapChaining</span><span class="p">)</span><span class="w"> </span><span class="nx">hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-27" id="__codelineno-4-27" name="__codelineno-4-27"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">capacity</span>
<a href="#__codelineno-4-28" id="__codelineno-4-28" name="__codelineno-4-28"></a><span class="p">}</span>
<a href="#__codelineno-4-29" id="__codelineno-4-29" name="__codelineno-4-29"></a>
<a href="#__codelineno-4-30" id="__codelineno-4-30" name="__codelineno-4-30"></a><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-4-31" id="__codelineno-4-31" name="__codelineno-4-31"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">m</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapChaining</span><span class="p">)</span><span class="w"> </span><span class="nx">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="kt">float64</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-32" id="__codelineno-4-32" name="__codelineno-4-32"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kt">float64</span><span class="p">(</span><span class="nx">m</span><span class="p">.</span><span class="nx">size</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="kt">float64</span><span class="p">(</span><span class="nx">m</span><span class="p">.</span><span class="nx">capacity</span><span class="p">)</span>
<a href="#__codelineno-4-33" id="__codelineno-4-33" name="__codelineno-4-33"></a><span class="p">}</span>
<a href="#__codelineno-4-34" id="__codelineno-4-34" name="__codelineno-4-34"></a>
<a href="#__codelineno-4-35" id="__codelineno-4-35" name="__codelineno-4-35"></a><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-4-36" id="__codelineno-4-36" name="__codelineno-4-36"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">m</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapChaining</span><span class="p">)</span><span class="w"> </span><span class="nx">get</span><span class="p">(</span><span class="nx">key</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-37" id="__codelineno-4-37" name="__codelineno-4-37"></a><span class="w"> </span><span class="nx">idx</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span>
<a href="#__codelineno-4-38" id="__codelineno-4-38" name="__codelineno-4-38"></a><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span>
<a href="#__codelineno-4-39" id="__codelineno-4-39" name="__codelineno-4-39"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-4-40" id="__codelineno-4-40" name="__codelineno-4-40"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-41" id="__codelineno-4-41" name="__codelineno-4-41"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">p</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-42" id="__codelineno-4-42" name="__codelineno-4-42"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">p</span><span class="p">.</span><span class="nx">val</span>
<a href="#__codelineno-4-43" id="__codelineno-4-43" name="__codelineno-4-43"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-44" id="__codelineno-4-44" name="__codelineno-4-44"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-45" id="__codelineno-4-45" name="__codelineno-4-45"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、空文字列を返す</span>
<a href="#__codelineno-4-46" id="__codelineno-4-46" name="__codelineno-4-46"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s">""</span>
<a href="#__codelineno-4-47" id="__codelineno-4-47" name="__codelineno-4-47"></a><span class="p">}</span>
<a href="#__codelineno-4-48" id="__codelineno-4-48" name="__codelineno-4-48"></a>
<a href="#__codelineno-4-49" id="__codelineno-4-49" name="__codelineno-4-49"></a><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-4-50" id="__codelineno-4-50" name="__codelineno-4-50"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">m</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapChaining</span><span class="p">)</span><span class="w"> </span><span class="nx">put</span><span class="p">(</span><span class="nx">key</span><span class="w"> </span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="w"> </span><span class="kt">string</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-51" id="__codelineno-4-51" name="__codelineno-4-51"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-4-52" id="__codelineno-4-52" name="__codelineno-4-52"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">loadThres</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-53" id="__codelineno-4-53" name="__codelineno-4-53"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">extend</span><span class="p">()</span>
<a href="#__codelineno-4-54" id="__codelineno-4-54" name="__codelineno-4-54"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-55" id="__codelineno-4-55" name="__codelineno-4-55"></a><span class="w"> </span><span class="nx">idx</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span>
<a href="#__codelineno-4-56" id="__codelineno-4-56" name="__codelineno-4-56"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-4-57" id="__codelineno-4-57" name="__codelineno-4-57"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-58" id="__codelineno-4-58" name="__codelineno-4-58"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">idx</span><span class="p">][</span><span class="nx">i</span><span class="p">].</span><span class="nx">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-59" id="__codelineno-4-59" name="__codelineno-4-59"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">idx</span><span class="p">][</span><span class="nx">i</span><span class="p">].</span><span class="nx">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">val</span>
<a href="#__codelineno-4-60" id="__codelineno-4-60" name="__codelineno-4-60"></a><span class="w"> </span><span class="k">return</span>
<a href="#__codelineno-4-61" id="__codelineno-4-61" name="__codelineno-4-61"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-62" id="__codelineno-4-62" name="__codelineno-4-62"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-63" id="__codelineno-4-63" name="__codelineno-4-63"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-4-64" id="__codelineno-4-64" name="__codelineno-4-64"></a><span class="w"> </span><span class="nx">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">pair</span><span class="p">{</span>
<a href="#__codelineno-4-65" id="__codelineno-4-65" name="__codelineno-4-65"></a><span class="w"> </span><span class="nx">key</span><span class="p">:</span><span class="w"> </span><span class="nx">key</span><span class="p">,</span>
<a href="#__codelineno-4-66" id="__codelineno-4-66" name="__codelineno-4-66"></a><span class="w"> </span><span class="nx">val</span><span class="p">:</span><span class="w"> </span><span class="nx">val</span><span class="p">,</span>
<a href="#__codelineno-4-67" id="__codelineno-4-67" name="__codelineno-4-67"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-68" id="__codelineno-4-68" name="__codelineno-4-68"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">idx</span><span class="p">],</span><span class="w"> </span><span class="nx">p</span><span class="p">)</span>
<a href="#__codelineno-4-69" id="__codelineno-4-69" name="__codelineno-4-69"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">size</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span>
<a href="#__codelineno-4-70" id="__codelineno-4-70" name="__codelineno-4-70"></a><span class="p">}</span>
<a href="#__codelineno-4-71" id="__codelineno-4-71" name="__codelineno-4-71"></a>
<a href="#__codelineno-4-72" id="__codelineno-4-72" name="__codelineno-4-72"></a><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-4-73" id="__codelineno-4-73" name="__codelineno-4-73"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">m</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapChaining</span><span class="p">)</span><span class="w"> </span><span class="nx">remove</span><span class="p">(</span><span class="nx">key</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-74" id="__codelineno-4-74" name="__codelineno-4-74"></a><span class="w"> </span><span class="nx">idx</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span>
<a href="#__codelineno-4-75" id="__codelineno-4-75" name="__codelineno-4-75"></a><span class="w"> </span><span class="c1">// バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-4-76" id="__codelineno-4-76" name="__codelineno-4-76"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="nx">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-77" id="__codelineno-4-77" name="__codelineno-4-77"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">p</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-78" id="__codelineno-4-78" name="__codelineno-4-78"></a><span class="w"> </span><span class="c1">// スライスから削除する</span>
<a href="#__codelineno-4-79" id="__codelineno-4-79" name="__codelineno-4-79"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">idx</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">idx</span><span class="p">][:</span><span class="nx">i</span><span class="p">],</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">idx</span><span class="p">][</span><span class="nx">i</span><span class="o">+</span><span class="mi">1</span><span class="p">:]...)</span>
<a href="#__codelineno-4-80" id="__codelineno-4-80" name="__codelineno-4-80"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span>
<a href="#__codelineno-4-81" id="__codelineno-4-81" name="__codelineno-4-81"></a><span class="w"> </span><span class="k">break</span>
<a href="#__codelineno-4-82" id="__codelineno-4-82" name="__codelineno-4-82"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-83" id="__codelineno-4-83" name="__codelineno-4-83"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-84" id="__codelineno-4-84" name="__codelineno-4-84"></a><span class="p">}</span>
<a href="#__codelineno-4-85" id="__codelineno-4-85" name="__codelineno-4-85"></a>
<a href="#__codelineno-4-86" id="__codelineno-4-86" name="__codelineno-4-86"></a><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-4-87" id="__codelineno-4-87" name="__codelineno-4-87"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">m</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapChaining</span><span class="p">)</span><span class="w"> </span><span class="nx">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-88" id="__codelineno-4-88" name="__codelineno-4-88"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-4-89" id="__codelineno-4-89" name="__codelineno-4-89"></a><span class="w"> </span><span class="nx">tmpBuckets</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">make</span><span class="p">([][]</span><span class="nx">pair</span><span class="p">,</span><span class="w"> </span><span class="nb">len</span><span class="p">(</span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">))</span>
<a href="#__codelineno-4-90" id="__codelineno-4-90" name="__codelineno-4-90"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="nb">len</span><span class="p">(</span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">);</span><span class="w"> </span><span class="nx">i</span><span class="o">++</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-91" id="__codelineno-4-91" name="__codelineno-4-91"></a><span class="w"> </span><span class="nx">tmpBuckets</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">make</span><span class="p">([]</span><span class="nx">pair</span><span class="p">,</span><span class="w"> </span><span class="nb">len</span><span class="p">(</span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">i</span><span class="p">]))</span>
<a href="#__codelineno-4-92" id="__codelineno-4-92" name="__codelineno-4-92"></a><span class="w"> </span><span class="nb">copy</span><span class="p">(</span><span class="nx">tmpBuckets</span><span class="p">[</span><span class="nx">i</span><span class="p">],</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">i</span><span class="p">])</span>
<a href="#__codelineno-4-93" id="__codelineno-4-93" name="__codelineno-4-93"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-94" id="__codelineno-4-94" name="__codelineno-4-94"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-4-95" id="__codelineno-4-95" name="__codelineno-4-95"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">extendRatio</span>
<a href="#__codelineno-4-96" id="__codelineno-4-96" name="__codelineno-4-96"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">make</span><span class="p">([][]</span><span class="nx">pair</span><span class="p">,</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">capacity</span><span class="p">)</span>
<a href="#__codelineno-4-97" id="__codelineno-4-97" name="__codelineno-4-97"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">capacity</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="o">++</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-98" id="__codelineno-4-98" name="__codelineno-4-98"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">make</span><span class="p">([]</span><span class="nx">pair</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
<a href="#__codelineno-4-99" id="__codelineno-4-99" name="__codelineno-4-99"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-100" id="__codelineno-4-100" name="__codelineno-4-100"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
<a href="#__codelineno-4-101" id="__codelineno-4-101" name="__codelineno-4-101"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-4-102" id="__codelineno-4-102" name="__codelineno-4-102"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">tmpBuckets</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-103" id="__codelineno-4-103" name="__codelineno-4-103"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-104" id="__codelineno-4-104" name="__codelineno-4-104"></a><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">put</span><span class="p">(</span><span class="nx">p</span><span class="p">.</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">p</span><span class="p">.</span><span class="nx">val</span><span class="p">)</span>
<a href="#__codelineno-4-105" id="__codelineno-4-105" name="__codelineno-4-105"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-106" id="__codelineno-4-106" name="__codelineno-4-106"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-107" id="__codelineno-4-107" name="__codelineno-4-107"></a><span class="p">}</span>
<a href="#__codelineno-4-108" id="__codelineno-4-108" name="__codelineno-4-108"></a>
<a href="#__codelineno-4-109" id="__codelineno-4-109" name="__codelineno-4-109"></a><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-4-110" id="__codelineno-4-110" name="__codelineno-4-110"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">m</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapChaining</span><span class="p">)</span><span class="w"> </span><span class="nb">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-111" id="__codelineno-4-111" name="__codelineno-4-111"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">builder</span><span class="w"> </span><span class="nx">strings</span><span class="p">.</span><span class="nx">Builder</span>
<a href="#__codelineno-4-112" id="__codelineno-4-112" name="__codelineno-4-112"></a>
<a href="#__codelineno-4-113" id="__codelineno-4-113" name="__codelineno-4-113"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">m</span><span class="p">.</span><span class="nx">buckets</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-114" id="__codelineno-4-114" name="__codelineno-4-114"></a><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">WriteString</span><span class="p">(</span><span class="s">"["</span><span class="p">)</span>
<a href="#__codelineno-4-115" id="__codelineno-4-115" name="__codelineno-4-115"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">p</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-4-116" id="__codelineno-4-116" name="__codelineno-4-116"></a><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">WriteString</span><span class="p">(</span><span class="nx">strconv</span><span class="p">.</span><span class="nx">Itoa</span><span class="p">(</span><span class="nx">p</span><span class="p">.</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" -&gt; "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">p</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" "</span><span class="p">)</span>
<a href="#__codelineno-4-117" id="__codelineno-4-117" name="__codelineno-4-117"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-118" id="__codelineno-4-118" name="__codelineno-4-118"></a><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">WriteString</span><span class="p">(</span><span class="s">"]"</span><span class="p">)</span>
<a href="#__codelineno-4-119" id="__codelineno-4-119" name="__codelineno-4-119"></a><span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="nx">builder</span><span class="p">.</span><span class="nx">String</span><span class="p">())</span>
<a href="#__codelineno-4-120" id="__codelineno-4-120" name="__codelineno-4-120"></a><span class="w"> </span><span class="nx">builder</span><span class="p">.</span><span class="nx">Reset</span><span class="p">()</span>
<a href="#__codelineno-4-121" id="__codelineno-4-121" name="__codelineno-4-121"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-4-122" id="__codelineno-4-122" name="__codelineno-4-122"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.swift</span><pre><span></span><code><a href="#__codelineno-5-1" id="__codelineno-5-1" name="__codelineno-5-1"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-5-2" id="__codelineno-5-2" name="__codelineno-5-2"></a><span class="kd">class</span><span class="w"> </span><span class="nc">HashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-3" id="__codelineno-5-3" name="__codelineno-5-3"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">size</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-5-4" id="__codelineno-5-4" name="__codelineno-5-4"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">capacity</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-5-5" id="__codelineno-5-5" name="__codelineno-5-5"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">loadThres</span><span class="p">:</span><span class="w"> </span><span class="nb">Double</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-5-6" id="__codelineno-5-6" name="__codelineno-5-6"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">extendRatio</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-5-7" id="__codelineno-5-7" name="__codelineno-5-7"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">buckets</span><span class="p">:</span><span class="w"> </span><span class="p">[[</span><span class="n">Pair</span><span class="p">]]</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-5-8" id="__codelineno-5-8" name="__codelineno-5-8"></a>
<a href="#__codelineno-5-9" id="__codelineno-5-9" name="__codelineno-5-9"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-5-10" id="__codelineno-5-10" name="__codelineno-5-10"></a><span class="w"> </span><span class="kd">init</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-11" id="__codelineno-5-11" name="__codelineno-5-11"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span>
<a href="#__codelineno-5-12" id="__codelineno-5-12" name="__codelineno-5-12"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">4</span>
<a href="#__codelineno-5-13" id="__codelineno-5-13" name="__codelineno-5-13"></a><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span>
<a href="#__codelineno-5-14" id="__codelineno-5-14" name="__codelineno-5-14"></a><span class="w"> </span><span class="n">extendRatio</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">2</span>
<a href="#__codelineno-5-15" id="__codelineno-5-15" name="__codelineno-5-15"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="n">repeating</span><span class="p">:</span><span class="w"> </span><span class="p">[],</span><span class="w"> </span><span class="bp">count</span><span class="p">:</span><span class="w"> </span><span class="n">capacity</span><span class="p">)</span>
<a href="#__codelineno-5-16" id="__codelineno-5-16" name="__codelineno-5-16"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-17" id="__codelineno-5-17" name="__codelineno-5-17"></a>
<a href="#__codelineno-5-18" id="__codelineno-5-18" name="__codelineno-5-18"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-5-19" id="__codelineno-5-19" name="__codelineno-5-19"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nb">Int</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-20" id="__codelineno-5-20" name="__codelineno-5-20"></a><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span>
<a href="#__codelineno-5-21" id="__codelineno-5-21" name="__codelineno-5-21"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-22" id="__codelineno-5-22" name="__codelineno-5-22"></a>
<a href="#__codelineno-5-23" id="__codelineno-5-23" name="__codelineno-5-23"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-5-24" id="__codelineno-5-24" name="__codelineno-5-24"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nb">Double</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-25" id="__codelineno-5-25" name="__codelineno-5-25"></a><span class="w"> </span><span class="nb">Double</span><span class="p">(</span><span class="n">size</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nb">Double</span><span class="p">(</span><span class="n">capacity</span><span class="p">)</span>
<a href="#__codelineno-5-26" id="__codelineno-5-26" name="__codelineno-5-26"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-27" id="__codelineno-5-27" name="__codelineno-5-27"></a>
<a href="#__codelineno-5-28" id="__codelineno-5-28" name="__codelineno-5-28"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-5-29" id="__codelineno-5-29" name="__codelineno-5-29"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nb">String</span><span class="p">?</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-30" id="__codelineno-5-30" name="__codelineno-5-30"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-5-31" id="__codelineno-5-31" name="__codelineno-5-31"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">bucket</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<a href="#__codelineno-5-32" id="__codelineno-5-32" name="__codelineno-5-32"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-5-33" id="__codelineno-5-33" name="__codelineno-5-33"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-34" id="__codelineno-5-34" name="__codelineno-5-34"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-35" id="__codelineno-5-35" name="__codelineno-5-35"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span>
<a href="#__codelineno-5-36" id="__codelineno-5-36" name="__codelineno-5-36"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-37" id="__codelineno-5-37" name="__codelineno-5-37"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-38" id="__codelineno-5-38" name="__codelineno-5-38"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、nil を返す</span>
<a href="#__codelineno-5-39" id="__codelineno-5-39" name="__codelineno-5-39"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">nil</span>
<a href="#__codelineno-5-40" id="__codelineno-5-40" name="__codelineno-5-40"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-41" id="__codelineno-5-41" name="__codelineno-5-41"></a>
<a href="#__codelineno-5-42" id="__codelineno-5-42" name="__codelineno-5-42"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-5-43" id="__codelineno-5-43" name="__codelineno-5-43"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="nb">String</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-44" id="__codelineno-5-44" name="__codelineno-5-44"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-5-45" id="__codelineno-5-45" name="__codelineno-5-45"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-46" id="__codelineno-5-46" name="__codelineno-5-46"></a><span class="w"> </span><span class="bp">extend</span><span class="p">()</span>
<a href="#__codelineno-5-47" id="__codelineno-5-47" name="__codelineno-5-47"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-48" id="__codelineno-5-48" name="__codelineno-5-48"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-5-49" id="__codelineno-5-49" name="__codelineno-5-49"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">bucket</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<a href="#__codelineno-5-50" id="__codelineno-5-50" name="__codelineno-5-50"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-5-51" id="__codelineno-5-51" name="__codelineno-5-51"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-52" id="__codelineno-5-52" name="__codelineno-5-52"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-53" id="__codelineno-5-53" name="__codelineno-5-53"></a><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">val</span>
<a href="#__codelineno-5-54" id="__codelineno-5-54" name="__codelineno-5-54"></a><span class="w"> </span><span class="k">return</span>
<a href="#__codelineno-5-55" id="__codelineno-5-55" name="__codelineno-5-55"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-56" id="__codelineno-5-56" name="__codelineno-5-56"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-57" id="__codelineno-5-57" name="__codelineno-5-57"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-5-58" id="__codelineno-5-58" name="__codelineno-5-58"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">pair</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-5-59" id="__codelineno-5-59" name="__codelineno-5-59"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">append</span><span class="p">(</span><span class="n">pair</span><span class="p">)</span>
<a href="#__codelineno-5-60" id="__codelineno-5-60" name="__codelineno-5-60"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span>
<a href="#__codelineno-5-61" id="__codelineno-5-61" name="__codelineno-5-61"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-62" id="__codelineno-5-62" name="__codelineno-5-62"></a>
<a href="#__codelineno-5-63" id="__codelineno-5-63" name="__codelineno-5-63"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-5-64" id="__codelineno-5-64" name="__codelineno-5-64"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-65" id="__codelineno-5-65" name="__codelineno-5-65"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-5-66" id="__codelineno-5-66" name="__codelineno-5-66"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">bucket</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<a href="#__codelineno-5-67" id="__codelineno-5-67" name="__codelineno-5-67"></a><span class="w"> </span><span class="c1">// バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-5-68" id="__codelineno-5-68" name="__codelineno-5-68"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">pairIndex</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">)</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">.</span><span class="n">enumerated</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-69" id="__codelineno-5-69" name="__codelineno-5-69"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-70" id="__codelineno-5-70" name="__codelineno-5-70"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">remove</span><span class="p">(</span><span class="n">at</span><span class="p">:</span><span class="w"> </span><span class="n">pairIndex</span><span class="p">)</span>
<a href="#__codelineno-5-71" id="__codelineno-5-71" name="__codelineno-5-71"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span>
<a href="#__codelineno-5-72" id="__codelineno-5-72" name="__codelineno-5-72"></a><span class="w"> </span><span class="k">break</span>
<a href="#__codelineno-5-73" id="__codelineno-5-73" name="__codelineno-5-73"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-74" id="__codelineno-5-74" name="__codelineno-5-74"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-75" id="__codelineno-5-75" name="__codelineno-5-75"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-76" id="__codelineno-5-76" name="__codelineno-5-76"></a>
<a href="#__codelineno-5-77" id="__codelineno-5-77" name="__codelineno-5-77"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-5-78" id="__codelineno-5-78" name="__codelineno-5-78"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-79" id="__codelineno-5-79" name="__codelineno-5-79"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-5-80" id="__codelineno-5-80" name="__codelineno-5-80"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">bucketsTmp</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">buckets</span>
<a href="#__codelineno-5-81" id="__codelineno-5-81" name="__codelineno-5-81"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-5-82" id="__codelineno-5-82" name="__codelineno-5-82"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span>
<a href="#__codelineno-5-83" id="__codelineno-5-83" name="__codelineno-5-83"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="n">repeating</span><span class="p">:</span><span class="w"> </span><span class="p">[],</span><span class="w"> </span><span class="bp">count</span><span class="p">:</span><span class="w"> </span><span class="n">capacity</span><span class="p">)</span>
<a href="#__codelineno-5-84" id="__codelineno-5-84" name="__codelineno-5-84"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span>
<a href="#__codelineno-5-85" id="__codelineno-5-85" name="__codelineno-5-85"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-5-86" id="__codelineno-5-86" name="__codelineno-5-86"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-87" id="__codelineno-5-87" name="__codelineno-5-87"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-88" id="__codelineno-5-88" name="__codelineno-5-88"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-5-89" id="__codelineno-5-89" name="__codelineno-5-89"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-90" id="__codelineno-5-90" name="__codelineno-5-90"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-91" id="__codelineno-5-91" name="__codelineno-5-91"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-92" id="__codelineno-5-92" name="__codelineno-5-92"></a>
<a href="#__codelineno-5-93" id="__codelineno-5-93" name="__codelineno-5-93"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-5-94" id="__codelineno-5-94" name="__codelineno-5-94"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-95" id="__codelineno-5-95" name="__codelineno-5-95"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-5-96" id="__codelineno-5-96" name="__codelineno-5-96"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">res</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">bucket</span><span class="p">.</span><span class="bp">map</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s">"</span><span class="si">\(</span><span class="nv">$0</span><span class="p">.</span><span class="n">key</span><span class="si">)</span><span class="s"> -&gt; </span><span class="si">\(</span><span class="nv">$0</span><span class="p">.</span><span class="n">val</span><span class="si">)</span><span class="s">"</span><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-97" id="__codelineno-5-97" name="__codelineno-5-97"></a><span class="w"> </span><span class="n">Swift</span><span class="p">.</span><span class="bp">print</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
<a href="#__codelineno-5-98" id="__codelineno-5-98" name="__codelineno-5-98"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-99" id="__codelineno-5-99" name="__codelineno-5-99"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-5-100" id="__codelineno-5-100" name="__codelineno-5-100"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.js</span><pre><span></span><code><a href="#__codelineno-6-1" id="__codelineno-6-1" name="__codelineno-6-1"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-6-2" id="__codelineno-6-2" name="__codelineno-6-2"></a><span class="kd">class</span><span class="w"> </span><span class="nx">HashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-3" id="__codelineno-6-3" name="__codelineno-6-3"></a><span class="w"> </span><span class="n">#size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-6-4" id="__codelineno-6-4" name="__codelineno-6-4"></a><span class="w"> </span><span class="n">#capacity</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-6-5" id="__codelineno-6-5" name="__codelineno-6-5"></a><span class="w"> </span><span class="n">#loadThres</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-6-6" id="__codelineno-6-6" name="__codelineno-6-6"></a><span class="w"> </span><span class="n">#extendRatio</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-6-7" id="__codelineno-6-7" name="__codelineno-6-7"></a><span class="w"> </span><span class="n">#buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-6-8" id="__codelineno-6-8" name="__codelineno-6-8"></a>
<a href="#__codelineno-6-9" id="__codelineno-6-9" name="__codelineno-6-9"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-6-10" id="__codelineno-6-10" name="__codelineno-6-10"></a><span class="w"> </span><span class="kr">constructor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-11" id="__codelineno-6-11" name="__codelineno-6-11"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span>
<a href="#__codelineno-6-12" id="__codelineno-6-12" name="__codelineno-6-12"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">4</span><span class="p">;</span>
<a href="#__codelineno-6-13" id="__codelineno-6-13" name="__codelineno-6-13"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span>
<a href="#__codelineno-6-14" id="__codelineno-6-14" name="__codelineno-6-14"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2</span><span class="p">;</span>
<a href="#__codelineno-6-15" id="__codelineno-6-15" name="__codelineno-6-15"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">).</span><span class="nx">fill</span><span class="p">(</span><span class="kc">null</span><span class="p">).</span><span class="nx">map</span><span class="p">((</span><span class="nx">x</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">[]);</span>
<a href="#__codelineno-6-16" id="__codelineno-6-16" name="__codelineno-6-16"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-17" id="__codelineno-6-17" name="__codelineno-6-17"></a>
<a href="#__codelineno-6-18" id="__codelineno-6-18" name="__codelineno-6-18"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-6-19" id="__codelineno-6-19" name="__codelineno-6-19"></a><span class="w"> </span><span class="n">#hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-20" id="__codelineno-6-20" name="__codelineno-6-20"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">;</span>
<a href="#__codelineno-6-21" id="__codelineno-6-21" name="__codelineno-6-21"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-22" id="__codelineno-6-22" name="__codelineno-6-22"></a>
<a href="#__codelineno-6-23" id="__codelineno-6-23" name="__codelineno-6-23"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-6-24" id="__codelineno-6-24" name="__codelineno-6-24"></a><span class="w"> </span><span class="n">#loadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-25" id="__codelineno-6-25" name="__codelineno-6-25"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">;</span>
<a href="#__codelineno-6-26" id="__codelineno-6-26" name="__codelineno-6-26"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-27" id="__codelineno-6-27" name="__codelineno-6-27"></a>
<a href="#__codelineno-6-28" id="__codelineno-6-28" name="__codelineno-6-28"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-6-29" id="__codelineno-6-29" name="__codelineno-6-29"></a><span class="w"> </span><span class="nx">get</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-30" id="__codelineno-6-30" name="__codelineno-6-30"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-6-31" id="__codelineno-6-31" name="__codelineno-6-31"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
<a href="#__codelineno-6-32" id="__codelineno-6-32" name="__codelineno-6-32"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-6-33" id="__codelineno-6-33" name="__codelineno-6-33"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-34" id="__codelineno-6-34" name="__codelineno-6-34"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-35" id="__codelineno-6-35" name="__codelineno-6-35"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">;</span>
<a href="#__codelineno-6-36" id="__codelineno-6-36" name="__codelineno-6-36"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-37" id="__codelineno-6-37" name="__codelineno-6-37"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-38" id="__codelineno-6-38" name="__codelineno-6-38"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、null を返す</span>
<a href="#__codelineno-6-39" id="__codelineno-6-39" name="__codelineno-6-39"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<a href="#__codelineno-6-40" id="__codelineno-6-40" name="__codelineno-6-40"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-41" id="__codelineno-6-41" name="__codelineno-6-41"></a>
<a href="#__codelineno-6-42" id="__codelineno-6-42" name="__codelineno-6-42"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-6-43" id="__codelineno-6-43" name="__codelineno-6-43"></a><span class="w"> </span><span class="nx">put</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-44" id="__codelineno-6-44" name="__codelineno-6-44"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-6-45" id="__codelineno-6-45" name="__codelineno-6-45"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-46" id="__codelineno-6-46" name="__codelineno-6-46"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#extend</span><span class="p">();</span>
<a href="#__codelineno-6-47" id="__codelineno-6-47" name="__codelineno-6-47"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-48" id="__codelineno-6-48" name="__codelineno-6-48"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-6-49" id="__codelineno-6-49" name="__codelineno-6-49"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
<a href="#__codelineno-6-50" id="__codelineno-6-50" name="__codelineno-6-50"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-6-51" id="__codelineno-6-51" name="__codelineno-6-51"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-52" id="__codelineno-6-52" name="__codelineno-6-52"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-53" id="__codelineno-6-53" name="__codelineno-6-53"></a><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">val</span><span class="p">;</span>
<a href="#__codelineno-6-54" id="__codelineno-6-54" name="__codelineno-6-54"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-6-55" id="__codelineno-6-55" name="__codelineno-6-55"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-56" id="__codelineno-6-56" name="__codelineno-6-56"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-57" id="__codelineno-6-57" name="__codelineno-6-57"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-6-58" id="__codelineno-6-58" name="__codelineno-6-58"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">Pair</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-6-59" id="__codelineno-6-59" name="__codelineno-6-59"></a><span class="w"> </span><span class="nx">bucket</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">pair</span><span class="p">);</span>
<a href="#__codelineno-6-60" id="__codelineno-6-60" name="__codelineno-6-60"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-6-61" id="__codelineno-6-61" name="__codelineno-6-61"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-62" id="__codelineno-6-62" name="__codelineno-6-62"></a>
<a href="#__codelineno-6-63" id="__codelineno-6-63" name="__codelineno-6-63"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-6-64" id="__codelineno-6-64" name="__codelineno-6-64"></a><span class="w"> </span><span class="nx">remove</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-65" id="__codelineno-6-65" name="__codelineno-6-65"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-6-66" id="__codelineno-6-66" name="__codelineno-6-66"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
<a href="#__codelineno-6-67" id="__codelineno-6-67" name="__codelineno-6-67"></a><span class="w"> </span><span class="c1">// バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-6-68" id="__codelineno-6-68" name="__codelineno-6-68"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">let</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="nx">bucket</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-69" id="__codelineno-6-69" name="__codelineno-6-69"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">bucket</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">key</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-70" id="__codelineno-6-70" name="__codelineno-6-70"></a><span class="w"> </span><span class="nx">bucket</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="mf">1</span><span class="p">);</span>
<a href="#__codelineno-6-71" id="__codelineno-6-71" name="__codelineno-6-71"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-6-72" id="__codelineno-6-72" name="__codelineno-6-72"></a><span class="w"> </span><span class="k">break</span><span class="p">;</span>
<a href="#__codelineno-6-73" id="__codelineno-6-73" name="__codelineno-6-73"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-74" id="__codelineno-6-74" name="__codelineno-6-74"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-75" id="__codelineno-6-75" name="__codelineno-6-75"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-76" id="__codelineno-6-76" name="__codelineno-6-76"></a>
<a href="#__codelineno-6-77" id="__codelineno-6-77" name="__codelineno-6-77"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-6-78" id="__codelineno-6-78" name="__codelineno-6-78"></a><span class="w"> </span><span class="n">#extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-79" id="__codelineno-6-79" name="__codelineno-6-79"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-6-80" id="__codelineno-6-80" name="__codelineno-6-80"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">;</span>
<a href="#__codelineno-6-81" id="__codelineno-6-81" name="__codelineno-6-81"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-6-82" id="__codelineno-6-82" name="__codelineno-6-82"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#extendRatio</span><span class="p">;</span>
<a href="#__codelineno-6-83" id="__codelineno-6-83" name="__codelineno-6-83"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">).</span><span class="nx">fill</span><span class="p">(</span><span class="kc">null</span><span class="p">).</span><span class="nx">map</span><span class="p">((</span><span class="nx">x</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">[]);</span>
<a href="#__codelineno-6-84" id="__codelineno-6-84" name="__codelineno-6-84"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span>
<a href="#__codelineno-6-85" id="__codelineno-6-85" name="__codelineno-6-85"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-6-86" id="__codelineno-6-86" name="__codelineno-6-86"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-87" id="__codelineno-6-87" name="__codelineno-6-87"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-88" id="__codelineno-6-88" name="__codelineno-6-88"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">put</span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-6-89" id="__codelineno-6-89" name="__codelineno-6-89"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-90" id="__codelineno-6-90" name="__codelineno-6-90"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-91" id="__codelineno-6-91" name="__codelineno-6-91"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-92" id="__codelineno-6-92" name="__codelineno-6-92"></a>
<a href="#__codelineno-6-93" id="__codelineno-6-93" name="__codelineno-6-93"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-6-94" id="__codelineno-6-94" name="__codelineno-6-94"></a><span class="w"> </span><span class="nx">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-95" id="__codelineno-6-95" name="__codelineno-6-95"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-96" id="__codelineno-6-96" name="__codelineno-6-96"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[];</span>
<a href="#__codelineno-6-97" id="__codelineno-6-97" name="__codelineno-6-97"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-6-98" id="__codelineno-6-98" name="__codelineno-6-98"></a><span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">' -&gt; '</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-6-99" id="__codelineno-6-99" name="__codelineno-6-99"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-100" id="__codelineno-6-100" name="__codelineno-6-100"></a><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">res</span><span class="p">);</span>
<a href="#__codelineno-6-101" id="__codelineno-6-101" name="__codelineno-6-101"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-102" id="__codelineno-6-102" name="__codelineno-6-102"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-6-103" id="__codelineno-6-103" name="__codelineno-6-103"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.ts</span><pre><span></span><code><a href="#__codelineno-7-1" id="__codelineno-7-1" name="__codelineno-7-1"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-7-2" id="__codelineno-7-2" name="__codelineno-7-2"></a><span class="kd">class</span><span class="w"> </span><span class="nx">HashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-3" id="__codelineno-7-3" name="__codelineno-7-3"></a><span class="w"> </span><span class="n">#size</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-7-4" id="__codelineno-7-4" name="__codelineno-7-4"></a><span class="w"> </span><span class="n">#capacity</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-7-5" id="__codelineno-7-5" name="__codelineno-7-5"></a><span class="w"> </span><span class="n">#loadThres</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-7-6" id="__codelineno-7-6" name="__codelineno-7-6"></a><span class="w"> </span><span class="n">#extendRatio</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-7-7" id="__codelineno-7-7" name="__codelineno-7-7"></a><span class="w"> </span><span class="n">#buckets</span><span class="o">:</span><span class="w"> </span><span class="nx">Pair</span><span class="p">[][];</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-7-8" id="__codelineno-7-8" name="__codelineno-7-8"></a>
<a href="#__codelineno-7-9" id="__codelineno-7-9" name="__codelineno-7-9"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-7-10" id="__codelineno-7-10" name="__codelineno-7-10"></a><span class="w"> </span><span class="kr">constructor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-11" id="__codelineno-7-11" name="__codelineno-7-11"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span>
<a href="#__codelineno-7-12" id="__codelineno-7-12" name="__codelineno-7-12"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">4</span><span class="p">;</span>
<a href="#__codelineno-7-13" id="__codelineno-7-13" name="__codelineno-7-13"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span>
<a href="#__codelineno-7-14" id="__codelineno-7-14" name="__codelineno-7-14"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2</span><span class="p">;</span>
<a href="#__codelineno-7-15" id="__codelineno-7-15" name="__codelineno-7-15"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">).</span><span class="nx">fill</span><span class="p">(</span><span class="kc">null</span><span class="p">).</span><span class="nx">map</span><span class="p">((</span><span class="nx">x</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">[]);</span>
<a href="#__codelineno-7-16" id="__codelineno-7-16" name="__codelineno-7-16"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-17" id="__codelineno-7-17" name="__codelineno-7-17"></a>
<a href="#__codelineno-7-18" id="__codelineno-7-18" name="__codelineno-7-18"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-7-19" id="__codelineno-7-19" name="__codelineno-7-19"></a><span class="w"> </span><span class="n">#hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-20" id="__codelineno-7-20" name="__codelineno-7-20"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">;</span>
<a href="#__codelineno-7-21" id="__codelineno-7-21" name="__codelineno-7-21"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-22" id="__codelineno-7-22" name="__codelineno-7-22"></a>
<a href="#__codelineno-7-23" id="__codelineno-7-23" name="__codelineno-7-23"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-7-24" id="__codelineno-7-24" name="__codelineno-7-24"></a><span class="w"> </span><span class="n">#loadFactor</span><span class="p">()</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-25" id="__codelineno-7-25" name="__codelineno-7-25"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">;</span>
<a href="#__codelineno-7-26" id="__codelineno-7-26" name="__codelineno-7-26"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-27" id="__codelineno-7-27" name="__codelineno-7-27"></a>
<a href="#__codelineno-7-28" id="__codelineno-7-28" name="__codelineno-7-28"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-7-29" id="__codelineno-7-29" name="__codelineno-7-29"></a><span class="w"> </span><span class="nx">get</span><span class="p">(</span><span class="nx">key</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-30" id="__codelineno-7-30" name="__codelineno-7-30"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-7-31" id="__codelineno-7-31" name="__codelineno-7-31"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
<a href="#__codelineno-7-32" id="__codelineno-7-32" name="__codelineno-7-32"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-7-33" id="__codelineno-7-33" name="__codelineno-7-33"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-34" id="__codelineno-7-34" name="__codelineno-7-34"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-35" id="__codelineno-7-35" name="__codelineno-7-35"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">;</span>
<a href="#__codelineno-7-36" id="__codelineno-7-36" name="__codelineno-7-36"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-37" id="__codelineno-7-37" name="__codelineno-7-37"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-38" id="__codelineno-7-38" name="__codelineno-7-38"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、null を返す</span>
<a href="#__codelineno-7-39" id="__codelineno-7-39" name="__codelineno-7-39"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<a href="#__codelineno-7-40" id="__codelineno-7-40" name="__codelineno-7-40"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-41" id="__codelineno-7-41" name="__codelineno-7-41"></a>
<a href="#__codelineno-7-42" id="__codelineno-7-42" name="__codelineno-7-42"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-7-43" id="__codelineno-7-43" name="__codelineno-7-43"></a><span class="w"> </span><span class="nx">put</span><span class="p">(</span><span class="nx">key</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="o">:</span><span class="w"> </span><span class="kt">string</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-44" id="__codelineno-7-44" name="__codelineno-7-44"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-7-45" id="__codelineno-7-45" name="__codelineno-7-45"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-46" id="__codelineno-7-46" name="__codelineno-7-46"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#extend</span><span class="p">();</span>
<a href="#__codelineno-7-47" id="__codelineno-7-47" name="__codelineno-7-47"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-48" id="__codelineno-7-48" name="__codelineno-7-48"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-7-49" id="__codelineno-7-49" name="__codelineno-7-49"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
<a href="#__codelineno-7-50" id="__codelineno-7-50" name="__codelineno-7-50"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-7-51" id="__codelineno-7-51" name="__codelineno-7-51"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-52" id="__codelineno-7-52" name="__codelineno-7-52"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-53" id="__codelineno-7-53" name="__codelineno-7-53"></a><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">val</span><span class="p">;</span>
<a href="#__codelineno-7-54" id="__codelineno-7-54" name="__codelineno-7-54"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-7-55" id="__codelineno-7-55" name="__codelineno-7-55"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-56" id="__codelineno-7-56" name="__codelineno-7-56"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-57" id="__codelineno-7-57" name="__codelineno-7-57"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-7-58" id="__codelineno-7-58" name="__codelineno-7-58"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">Pair</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-7-59" id="__codelineno-7-59" name="__codelineno-7-59"></a><span class="w"> </span><span class="nx">bucket</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">pair</span><span class="p">);</span>
<a href="#__codelineno-7-60" id="__codelineno-7-60" name="__codelineno-7-60"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-7-61" id="__codelineno-7-61" name="__codelineno-7-61"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-62" id="__codelineno-7-62" name="__codelineno-7-62"></a>
<a href="#__codelineno-7-63" id="__codelineno-7-63" name="__codelineno-7-63"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-7-64" id="__codelineno-7-64" name="__codelineno-7-64"></a><span class="w"> </span><span class="nx">remove</span><span class="p">(</span><span class="nx">key</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-65" id="__codelineno-7-65" name="__codelineno-7-65"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-7-66" id="__codelineno-7-66" name="__codelineno-7-66"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
<a href="#__codelineno-7-67" id="__codelineno-7-67" name="__codelineno-7-67"></a><span class="w"> </span><span class="c1">// バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-7-68" id="__codelineno-7-68" name="__codelineno-7-68"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">let</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="nx">bucket</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span><span class="w"> </span><span class="nx">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-69" id="__codelineno-7-69" name="__codelineno-7-69"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">bucket</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">key</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-70" id="__codelineno-7-70" name="__codelineno-7-70"></a><span class="w"> </span><span class="nx">bucket</span><span class="p">.</span><span class="nx">splice</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span><span class="w"> </span><span class="mf">1</span><span class="p">);</span>
<a href="#__codelineno-7-71" id="__codelineno-7-71" name="__codelineno-7-71"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-7-72" id="__codelineno-7-72" name="__codelineno-7-72"></a><span class="w"> </span><span class="k">break</span><span class="p">;</span>
<a href="#__codelineno-7-73" id="__codelineno-7-73" name="__codelineno-7-73"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-74" id="__codelineno-7-74" name="__codelineno-7-74"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-75" id="__codelineno-7-75" name="__codelineno-7-75"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-76" id="__codelineno-7-76" name="__codelineno-7-76"></a>
<a href="#__codelineno-7-77" id="__codelineno-7-77" name="__codelineno-7-77"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-7-78" id="__codelineno-7-78" name="__codelineno-7-78"></a><span class="w"> </span><span class="n">#extend</span><span class="p">()</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-79" id="__codelineno-7-79" name="__codelineno-7-79"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-7-80" id="__codelineno-7-80" name="__codelineno-7-80"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">;</span>
<a href="#__codelineno-7-81" id="__codelineno-7-81" name="__codelineno-7-81"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-7-82" id="__codelineno-7-82" name="__codelineno-7-82"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#extendRatio</span><span class="p">;</span>
<a href="#__codelineno-7-83" id="__codelineno-7-83" name="__codelineno-7-83"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">).</span><span class="nx">fill</span><span class="p">(</span><span class="kc">null</span><span class="p">).</span><span class="nx">map</span><span class="p">((</span><span class="nx">x</span><span class="p">)</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">[]);</span>
<a href="#__codelineno-7-84" id="__codelineno-7-84" name="__codelineno-7-84"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span>
<a href="#__codelineno-7-85" id="__codelineno-7-85" name="__codelineno-7-85"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-7-86" id="__codelineno-7-86" name="__codelineno-7-86"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-87" id="__codelineno-7-87" name="__codelineno-7-87"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-88" id="__codelineno-7-88" name="__codelineno-7-88"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">put</span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-7-89" id="__codelineno-7-89" name="__codelineno-7-89"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-90" id="__codelineno-7-90" name="__codelineno-7-90"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-91" id="__codelineno-7-91" name="__codelineno-7-91"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-92" id="__codelineno-7-92" name="__codelineno-7-92"></a>
<a href="#__codelineno-7-93" id="__codelineno-7-93" name="__codelineno-7-93"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-7-94" id="__codelineno-7-94" name="__codelineno-7-94"></a><span class="w"> </span><span class="nx">print</span><span class="p">()</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-95" id="__codelineno-7-95" name="__codelineno-7-95"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">bucket</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-96" id="__codelineno-7-96" name="__codelineno-7-96"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[];</span>
<a href="#__codelineno-7-97" id="__codelineno-7-97" name="__codelineno-7-97"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-7-98" id="__codelineno-7-98" name="__codelineno-7-98"></a><span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">' -&gt; '</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-7-99" id="__codelineno-7-99" name="__codelineno-7-99"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-100" id="__codelineno-7-100" name="__codelineno-7-100"></a><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">res</span><span class="p">);</span>
<a href="#__codelineno-7-101" id="__codelineno-7-101" name="__codelineno-7-101"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-102" id="__codelineno-7-102" name="__codelineno-7-102"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-7-103" id="__codelineno-7-103" name="__codelineno-7-103"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.dart</span><pre><span></span><code><a href="#__codelineno-8-1" id="__codelineno-8-1" name="__codelineno-8-1"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-8-2" id="__codelineno-8-2" name="__codelineno-8-2"></a><span class="kd">class</span><span class="w"> </span><span class="nc">HashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-3" id="__codelineno-8-3" name="__codelineno-8-3"></a><span class="w"> </span><span class="kd">late</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-8-4" id="__codelineno-8-4" name="__codelineno-8-4"></a><span class="w"> </span><span class="kd">late</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-8-5" id="__codelineno-8-5" name="__codelineno-8-5"></a><span class="w"> </span><span class="kd">late</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadThres</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-8-6" id="__codelineno-8-6" name="__codelineno-8-6"></a><span class="w"> </span><span class="kd">late</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-8-7" id="__codelineno-8-7" name="__codelineno-8-7"></a><span class="w"> </span><span class="kd">late</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-8-8" id="__codelineno-8-8" name="__codelineno-8-8"></a>
<a href="#__codelineno-8-9" id="__codelineno-8-9" name="__codelineno-8-9"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-8-10" id="__codelineno-8-10" name="__codelineno-8-10"></a><span class="w"> </span><span class="n">HashMapChaining</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-11" id="__codelineno-8-11" name="__codelineno-8-11"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<a href="#__codelineno-8-12" id="__codelineno-8-12" name="__codelineno-8-12"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span><span class="p">;</span>
<a href="#__codelineno-8-13" id="__codelineno-8-13" name="__codelineno-8-13"></a><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">3.0</span><span class="p">;</span>
<a href="#__codelineno-8-14" id="__codelineno-8-14" name="__codelineno-8-14"></a><span class="w"> </span><span class="n">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">;</span>
<a href="#__codelineno-8-15" id="__codelineno-8-15" name="__codelineno-8-15"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">List</span><span class="p">.</span><span class="n">generate</span><span class="p">(</span><span class="n">capacity</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">[]);</span>
<a href="#__codelineno-8-16" id="__codelineno-8-16" name="__codelineno-8-16"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-17" id="__codelineno-8-17" name="__codelineno-8-17"></a>
<a href="#__codelineno-8-18" id="__codelineno-8-18" name="__codelineno-8-18"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-8-19" id="__codelineno-8-19" name="__codelineno-8-19"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-20" id="__codelineno-8-20" name="__codelineno-8-20"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-8-21" id="__codelineno-8-21" name="__codelineno-8-21"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-22" id="__codelineno-8-22" name="__codelineno-8-22"></a>
<a href="#__codelineno-8-23" id="__codelineno-8-23" name="__codelineno-8-23"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-8-24" id="__codelineno-8-24" name="__codelineno-8-24"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-25" id="__codelineno-8-25" name="__codelineno-8-25"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-8-26" id="__codelineno-8-26" name="__codelineno-8-26"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-27" id="__codelineno-8-27" name="__codelineno-8-27"></a>
<a href="#__codelineno-8-28" id="__codelineno-8-28" name="__codelineno-8-28"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-8-29" id="__codelineno-8-29" name="__codelineno-8-29"></a><span class="w"> </span><span class="kt">String</span><span class="o">?</span><span class="w"> </span><span class="kd">get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-30" id="__codelineno-8-30" name="__codelineno-8-30"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-8-31" id="__codelineno-8-31" name="__codelineno-8-31"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-8-32" id="__codelineno-8-32" name="__codelineno-8-32"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-8-33" id="__codelineno-8-33" name="__codelineno-8-33"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-34" id="__codelineno-8-34" name="__codelineno-8-34"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-35" id="__codelineno-8-35" name="__codelineno-8-35"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-8-36" id="__codelineno-8-36" name="__codelineno-8-36"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-37" id="__codelineno-8-37" name="__codelineno-8-37"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-38" id="__codelineno-8-38" name="__codelineno-8-38"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、null を返す</span>
<a href="#__codelineno-8-39" id="__codelineno-8-39" name="__codelineno-8-39"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<a href="#__codelineno-8-40" id="__codelineno-8-40" name="__codelineno-8-40"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-41" id="__codelineno-8-41" name="__codelineno-8-41"></a>
<a href="#__codelineno-8-42" id="__codelineno-8-42" name="__codelineno-8-42"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-8-43" id="__codelineno-8-43" name="__codelineno-8-43"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="kt">String</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-44" id="__codelineno-8-44" name="__codelineno-8-44"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-8-45" id="__codelineno-8-45" name="__codelineno-8-45"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-46" id="__codelineno-8-46" name="__codelineno-8-46"></a><span class="w"> </span><span class="n">extend</span><span class="p">();</span>
<a href="#__codelineno-8-47" id="__codelineno-8-47" name="__codelineno-8-47"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-48" id="__codelineno-8-48" name="__codelineno-8-48"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-8-49" id="__codelineno-8-49" name="__codelineno-8-49"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-8-50" id="__codelineno-8-50" name="__codelineno-8-50"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-8-51" id="__codelineno-8-51" name="__codelineno-8-51"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-52" id="__codelineno-8-52" name="__codelineno-8-52"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-53" id="__codelineno-8-53" name="__codelineno-8-53"></a><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-8-54" id="__codelineno-8-54" name="__codelineno-8-54"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-8-55" id="__codelineno-8-55" name="__codelineno-8-55"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-56" id="__codelineno-8-56" name="__codelineno-8-56"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-57" id="__codelineno-8-57" name="__codelineno-8-57"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-8-58" id="__codelineno-8-58" name="__codelineno-8-58"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-8-59" id="__codelineno-8-59" name="__codelineno-8-59"></a><span class="w"> </span><span class="n">bucket</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-8-60" id="__codelineno-8-60" name="__codelineno-8-60"></a><span class="w"> </span><span class="n">size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-8-61" id="__codelineno-8-61" name="__codelineno-8-61"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-62" id="__codelineno-8-62" name="__codelineno-8-62"></a>
<a href="#__codelineno-8-63" id="__codelineno-8-63" name="__codelineno-8-63"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-8-64" id="__codelineno-8-64" name="__codelineno-8-64"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">remove</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-65" id="__codelineno-8-65" name="__codelineno-8-65"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-8-66" id="__codelineno-8-66" name="__codelineno-8-66"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-8-67" id="__codelineno-8-67" name="__codelineno-8-67"></a><span class="w"> </span><span class="c1">// バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-8-68" id="__codelineno-8-68" name="__codelineno-8-68"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-69" id="__codelineno-8-69" name="__codelineno-8-69"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-70" id="__codelineno-8-70" name="__codelineno-8-70"></a><span class="w"> </span><span class="n">bucket</span><span class="p">.</span><span class="n">remove</span><span class="p">(</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-8-71" id="__codelineno-8-71" name="__codelineno-8-71"></a><span class="w"> </span><span class="n">size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-8-72" id="__codelineno-8-72" name="__codelineno-8-72"></a><span class="w"> </span><span class="k">break</span><span class="p">;</span>
<a href="#__codelineno-8-73" id="__codelineno-8-73" name="__codelineno-8-73"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-74" id="__codelineno-8-74" name="__codelineno-8-74"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-75" id="__codelineno-8-75" name="__codelineno-8-75"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-76" id="__codelineno-8-76" name="__codelineno-8-76"></a>
<a href="#__codelineno-8-77" id="__codelineno-8-77" name="__codelineno-8-77"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-8-78" id="__codelineno-8-78" name="__codelineno-8-78"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-79" id="__codelineno-8-79" name="__codelineno-8-79"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-8-80" id="__codelineno-8-80" name="__codelineno-8-80"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span>
<a href="#__codelineno-8-81" id="__codelineno-8-81" name="__codelineno-8-81"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-8-82" id="__codelineno-8-82" name="__codelineno-8-82"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span>
<a href="#__codelineno-8-83" id="__codelineno-8-83" name="__codelineno-8-83"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">List</span><span class="p">.</span><span class="n">generate</span><span class="p">(</span><span class="n">capacity</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">[]);</span>
<a href="#__codelineno-8-84" id="__codelineno-8-84" name="__codelineno-8-84"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<a href="#__codelineno-8-85" id="__codelineno-8-85" name="__codelineno-8-85"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-8-86" id="__codelineno-8-86" name="__codelineno-8-86"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-87" id="__codelineno-8-87" name="__codelineno-8-87"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-88" id="__codelineno-8-88" name="__codelineno-8-88"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-8-89" id="__codelineno-8-89" name="__codelineno-8-89"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-90" id="__codelineno-8-90" name="__codelineno-8-90"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-91" id="__codelineno-8-91" name="__codelineno-8-91"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-92" id="__codelineno-8-92" name="__codelineno-8-92"></a>
<a href="#__codelineno-8-93" id="__codelineno-8-93" name="__codelineno-8-93"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-8-94" id="__codelineno-8-94" name="__codelineno-8-94"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">printHashMap</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-95" id="__codelineno-8-95" name="__codelineno-8-95"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-96" id="__codelineno-8-96" name="__codelineno-8-96"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="kt">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[];</span>
<a href="#__codelineno-8-97" id="__codelineno-8-97" name="__codelineno-8-97"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-8-98" id="__codelineno-8-98" name="__codelineno-8-98"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="s2">"</span><span class="si">${</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">${</span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="si">}</span><span class="s2">"</span><span class="p">);</span>
<a href="#__codelineno-8-99" id="__codelineno-8-99" name="__codelineno-8-99"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-100" id="__codelineno-8-100" name="__codelineno-8-100"></a><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="n">res</span><span class="p">);</span>
<a href="#__codelineno-8-101" id="__codelineno-8-101" name="__codelineno-8-101"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-102" id="__codelineno-8-102" name="__codelineno-8-102"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-8-103" id="__codelineno-8-103" name="__codelineno-8-103"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.rs</span><pre><span></span><code><a href="#__codelineno-9-1" id="__codelineno-9-1" name="__codelineno-9-1"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-9-2" id="__codelineno-9-2" name="__codelineno-9-2"></a><span class="k">struct</span><span class="w"> </span><span class="nc">HashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-3" id="__codelineno-9-3" name="__codelineno-9-3"></a><span class="w"> </span><span class="n">size</span><span class="p">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span>
<a href="#__codelineno-9-4" id="__codelineno-9-4" name="__codelineno-9-4"></a><span class="w"> </span><span class="n">capacity</span><span class="p">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span>
<a href="#__codelineno-9-5" id="__codelineno-9-5" name="__codelineno-9-5"></a><span class="w"> </span><span class="n">load_thres</span><span class="p">:</span><span class="w"> </span><span class="kt">f32</span><span class="p">,</span>
<a href="#__codelineno-9-6" id="__codelineno-9-6" name="__codelineno-9-6"></a><span class="w"> </span><span class="n">extend_ratio</span><span class="p">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span>
<a href="#__codelineno-9-7" id="__codelineno-9-7" name="__codelineno-9-7"></a><span class="w"> </span><span class="n">buckets</span><span class="p">:</span><span class="w"> </span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Vec</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="p">,</span>
<a href="#__codelineno-9-8" id="__codelineno-9-8" name="__codelineno-9-8"></a><span class="p">}</span>
<a href="#__codelineno-9-9" id="__codelineno-9-9" name="__codelineno-9-9"></a>
<a href="#__codelineno-9-10" id="__codelineno-9-10" name="__codelineno-9-10"></a><span class="k">impl</span><span class="w"> </span><span class="n">HashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-11" id="__codelineno-9-11" name="__codelineno-9-11"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-9-12" id="__codelineno-9-12" name="__codelineno-9-12"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">new</span><span class="p">()</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nc">Self</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-13" id="__codelineno-9-13" name="__codelineno-9-13"></a><span class="w"> </span><span class="bp">Self</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-14" id="__codelineno-9-14" name="__codelineno-9-14"></a><span class="w"> </span><span class="n">size</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<a href="#__codelineno-9-15" id="__codelineno-9-15" name="__codelineno-9-15"></a><span class="w"> </span><span class="n">capacity</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span>
<a href="#__codelineno-9-16" id="__codelineno-9-16" name="__codelineno-9-16"></a><span class="w"> </span><span class="n">load_thres</span><span class="p">:</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">,</span>
<a href="#__codelineno-9-17" id="__codelineno-9-17" name="__codelineno-9-17"></a><span class="w"> </span><span class="n">extend_ratio</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<a href="#__codelineno-9-18" id="__codelineno-9-18" name="__codelineno-9-18"></a><span class="w"> </span><span class="n">buckets</span><span class="p">:</span><span class="w"> </span><span class="nc">vec</span><span class="o">!</span><span class="p">[</span><span class="fm">vec!</span><span class="p">[];</span><span class="w"> </span><span class="mi">4</span><span class="p">],</span>
<a href="#__codelineno-9-19" id="__codelineno-9-19" name="__codelineno-9-19"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-20" id="__codelineno-9-20" name="__codelineno-9-20"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-21" id="__codelineno-9-21" name="__codelineno-9-21"></a>
<a href="#__codelineno-9-22" id="__codelineno-9-22" name="__codelineno-9-22"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-9-23" id="__codelineno-9-23" name="__codelineno-9-23"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">hash_func</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-24" id="__codelineno-9-24" name="__codelineno-9-24"></a><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">capacity</span>
<a href="#__codelineno-9-25" id="__codelineno-9-25" name="__codelineno-9-25"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-26" id="__codelineno-9-26" name="__codelineno-9-26"></a>
<a href="#__codelineno-9-27" id="__codelineno-9-27" name="__codelineno-9-27"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-9-28" id="__codelineno-9-28" name="__codelineno-9-28"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">load_factor</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="kt">f32</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-29" id="__codelineno-9-29" name="__codelineno-9-29"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">size</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">f32</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">f32</span>
<a href="#__codelineno-9-30" id="__codelineno-9-30" name="__codelineno-9-30"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-31" id="__codelineno-9-31" name="__codelineno-9-31"></a>
<a href="#__codelineno-9-32" id="__codelineno-9-32" name="__codelineno-9-32"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-9-33" id="__codelineno-9-33" name="__codelineno-9-33"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nb">Option</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-34" id="__codelineno-9-34" name="__codelineno-9-34"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-9-35" id="__codelineno-9-35" name="__codelineno-9-35"></a>
<a href="#__codelineno-9-36" id="__codelineno-9-36" name="__codelineno-9-36"></a><span class="w"> </span><span class="c1">// バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-9-37" id="__codelineno-9-37" name="__codelineno-9-37"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="w"> </span><span class="n">p</span><span class="p">)</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">iter_mut</span><span class="p">().</span><span class="n">enumerate</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-38" id="__codelineno-9-38" name="__codelineno-9-38"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">p</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-39" id="__codelineno-9-39" name="__codelineno-9-39"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">remove</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
<a href="#__codelineno-9-40" id="__codelineno-9-40" name="__codelineno-9-40"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a href="#__codelineno-9-41" id="__codelineno-9-41" name="__codelineno-9-41"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-9-42" id="__codelineno-9-42" name="__codelineno-9-42"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-43" id="__codelineno-9-43" name="__codelineno-9-43"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-44" id="__codelineno-9-44" name="__codelineno-9-44"></a>
<a href="#__codelineno-9-45" id="__codelineno-9-45" name="__codelineno-9-45"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、None を返す</span>
<a href="#__codelineno-9-46" id="__codelineno-9-46" name="__codelineno-9-46"></a><span class="w"> </span><span class="nb">None</span>
<a href="#__codelineno-9-47" id="__codelineno-9-47" name="__codelineno-9-47"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-48" id="__codelineno-9-48" name="__codelineno-9-48"></a>
<a href="#__codelineno-9-49" id="__codelineno-9-49" name="__codelineno-9-49"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-9-50" id="__codelineno-9-50" name="__codelineno-9-50"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">extend</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-51" id="__codelineno-9-51" name="__codelineno-9-51"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-9-52" id="__codelineno-9-52" name="__codelineno-9-52"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">buckets_tmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">::</span><span class="n">mem</span><span class="p">::</span><span class="n">take</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">);</span>
<a href="#__codelineno-9-53" id="__codelineno-9-53" name="__codelineno-9-53"></a>
<a href="#__codelineno-9-54" id="__codelineno-9-54" name="__codelineno-9-54"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-9-55" id="__codelineno-9-55" name="__codelineno-9-55"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">extend_ratio</span><span class="p">;</span>
<a href="#__codelineno-9-56" id="__codelineno-9-56" name="__codelineno-9-56"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="fm">vec!</span><span class="p">[</span><span class="nb">Vec</span><span class="p">::</span><span class="n">new</span><span class="p">();</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">usize</span><span class="p">];</span>
<a href="#__codelineno-9-57" id="__codelineno-9-57" name="__codelineno-9-57"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-9-58" id="__codelineno-9-58" name="__codelineno-9-58"></a>
<a href="#__codelineno-9-59" id="__codelineno-9-59" name="__codelineno-9-59"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-9-60" id="__codelineno-9-60" name="__codelineno-9-60"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets_tmp</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-61" id="__codelineno-9-61" name="__codelineno-9-61"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-62" id="__codelineno-9-62" name="__codelineno-9-62"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-9-63" id="__codelineno-9-63" name="__codelineno-9-63"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-64" id="__codelineno-9-64" name="__codelineno-9-64"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-65" id="__codelineno-9-65" name="__codelineno-9-65"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-66" id="__codelineno-9-66" name="__codelineno-9-66"></a>
<a href="#__codelineno-9-67" id="__codelineno-9-67" name="__codelineno-9-67"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-9-68" id="__codelineno-9-68" name="__codelineno-9-68"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">print</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-69" id="__codelineno-9-69" name="__codelineno-9-69"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="o">&amp;</span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-70" id="__codelineno-9-70" name="__codelineno-9-70"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Vec</span><span class="p">::</span><span class="n">new</span><span class="p">();</span>
<a href="#__codelineno-9-71" id="__codelineno-9-71" name="__codelineno-9-71"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-72" id="__codelineno-9-72" name="__codelineno-9-72"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="fm">format!</span><span class="p">(</span><span class="s">"{} -&gt; {}"</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">));</span>
<a href="#__codelineno-9-73" id="__codelineno-9-73" name="__codelineno-9-73"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-74" id="__codelineno-9-74" name="__codelineno-9-74"></a><span class="w"> </span><span class="fm">println!</span><span class="p">(</span><span class="s">"{:?}"</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
<a href="#__codelineno-9-75" id="__codelineno-9-75" name="__codelineno-9-75"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-76" id="__codelineno-9-76" name="__codelineno-9-76"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-77" id="__codelineno-9-77" name="__codelineno-9-77"></a>
<a href="#__codelineno-9-78" id="__codelineno-9-78" name="__codelineno-9-78"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-9-79" id="__codelineno-9-79" name="__codelineno-9-79"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="nb">String</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-80" id="__codelineno-9-80" name="__codelineno-9-80"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-9-81" id="__codelineno-9-81" name="__codelineno-9-81"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">load_factor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">load_thres</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-82" id="__codelineno-9-82" name="__codelineno-9-82"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">extend</span><span class="p">();</span>
<a href="#__codelineno-9-83" id="__codelineno-9-83" name="__codelineno-9-83"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-84" id="__codelineno-9-84" name="__codelineno-9-84"></a>
<a href="#__codelineno-9-85" id="__codelineno-9-85" name="__codelineno-9-85"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-9-86" id="__codelineno-9-86" name="__codelineno-9-86"></a>
<a href="#__codelineno-9-87" id="__codelineno-9-87" name="__codelineno-9-87"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-9-88" id="__codelineno-9-88" name="__codelineno-9-88"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">iter_mut</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-89" id="__codelineno-9-89" name="__codelineno-9-89"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-90" id="__codelineno-9-90" name="__codelineno-9-90"></a><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-9-91" id="__codelineno-9-91" name="__codelineno-9-91"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-9-92" id="__codelineno-9-92" name="__codelineno-9-92"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-93" id="__codelineno-9-93" name="__codelineno-9-93"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-94" id="__codelineno-9-94" name="__codelineno-9-94"></a>
<a href="#__codelineno-9-95" id="__codelineno-9-95" name="__codelineno-9-95"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-9-96" id="__codelineno-9-96" name="__codelineno-9-96"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="w"> </span><span class="p">};</span>
<a href="#__codelineno-9-97" id="__codelineno-9-97" name="__codelineno-9-97"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">push</span><span class="p">(</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-9-98" id="__codelineno-9-98" name="__codelineno-9-98"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">size</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a href="#__codelineno-9-99" id="__codelineno-9-99" name="__codelineno-9-99"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-100" id="__codelineno-9-100" name="__codelineno-9-100"></a>
<a href="#__codelineno-9-101" id="__codelineno-9-101" name="__codelineno-9-101"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-9-102" id="__codelineno-9-102" name="__codelineno-9-102"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="kt">str</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-103" id="__codelineno-9-103" name="__codelineno-9-103"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-9-104" id="__codelineno-9-104" name="__codelineno-9-104"></a>
<a href="#__codelineno-9-105" id="__codelineno-9-105" name="__codelineno-9-105"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-9-106" id="__codelineno-9-106" name="__codelineno-9-106"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">iter</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-107" id="__codelineno-9-107" name="__codelineno-9-107"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-9-108" id="__codelineno-9-108" name="__codelineno-9-108"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="o">&amp;</span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-9-109" id="__codelineno-9-109" name="__codelineno-9-109"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-110" id="__codelineno-9-110" name="__codelineno-9-110"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-111" id="__codelineno-9-111" name="__codelineno-9-111"></a>
<a href="#__codelineno-9-112" id="__codelineno-9-112" name="__codelineno-9-112"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、None を返す</span>
<a href="#__codelineno-9-113" id="__codelineno-9-113" name="__codelineno-9-113"></a><span class="w"> </span><span class="nb">None</span>
<a href="#__codelineno-9-114" id="__codelineno-9-114" name="__codelineno-9-114"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-9-115" id="__codelineno-9-115" name="__codelineno-9-115"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.c</span><pre><span></span><code><a href="#__codelineno-10-1" id="__codelineno-10-1" name="__codelineno-10-1"></a><span class="cm">/* 連結リストのノード */</span>
<a href="#__codelineno-10-2" id="__codelineno-10-2" name="__codelineno-10-2"></a><span class="k">typedef</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">Node</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-3" id="__codelineno-10-3" name="__codelineno-10-3"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="p">;</span>
<a href="#__codelineno-10-4" id="__codelineno-10-4" name="__codelineno-10-4"></a><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="nc">Node</span><span class="w"> </span><span class="o">*</span><span class="n">next</span><span class="p">;</span>
<a href="#__codelineno-10-5" id="__codelineno-10-5" name="__codelineno-10-5"></a><span class="p">}</span><span class="w"> </span><span class="n">Node</span><span class="p">;</span>
<a href="#__codelineno-10-6" id="__codelineno-10-6" name="__codelineno-10-6"></a>
<a href="#__codelineno-10-7" id="__codelineno-10-7" name="__codelineno-10-7"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-10-8" id="__codelineno-10-8" name="__codelineno-10-8"></a><span class="k">typedef</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-9" id="__codelineno-10-9" name="__codelineno-10-9"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-10-10" id="__codelineno-10-10" name="__codelineno-10-10"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-10-11" id="__codelineno-10-11" name="__codelineno-10-11"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadThres</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-10-12" id="__codelineno-10-12" name="__codelineno-10-12"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-10-13" id="__codelineno-10-13" name="__codelineno-10-13"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">**</span><span class="n">buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-10-14" id="__codelineno-10-14" name="__codelineno-10-14"></a><span class="p">}</span><span class="w"> </span><span class="n">HashMapChaining</span><span class="p">;</span>
<a href="#__codelineno-10-15" id="__codelineno-10-15" name="__codelineno-10-15"></a>
<a href="#__codelineno-10-16" id="__codelineno-10-16" name="__codelineno-10-16"></a><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-10-17" id="__codelineno-10-17" name="__codelineno-10-17"></a><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="nf">newHashMapChaining</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-18" id="__codelineno-10-18" name="__codelineno-10-18"></a><span class="w"> </span><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">HashMapChaining</span><span class="p">));</span>
<a href="#__codelineno-10-19" id="__codelineno-10-19" name="__codelineno-10-19"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-10-20" id="__codelineno-10-20" name="__codelineno-10-20"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span>
<a href="#__codelineno-10-21" id="__codelineno-10-21" name="__codelineno-10-21"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span>
<a href="#__codelineno-10-22" id="__codelineno-10-22" name="__codelineno-10-22"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span>
<a href="#__codelineno-10-23" id="__codelineno-10-23" name="__codelineno-10-23"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="o">**</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="p">));</span>
<a href="#__codelineno-10-24" id="__codelineno-10-24" name="__codelineno-10-24"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-25" id="__codelineno-10-25" name="__codelineno-10-25"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<a href="#__codelineno-10-26" id="__codelineno-10-26" name="__codelineno-10-26"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-27" id="__codelineno-10-27" name="__codelineno-10-27"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">hashMap</span><span class="p">;</span>
<a href="#__codelineno-10-28" id="__codelineno-10-28" name="__codelineno-10-28"></a><span class="p">}</span>
<a href="#__codelineno-10-29" id="__codelineno-10-29" name="__codelineno-10-29"></a>
<a href="#__codelineno-10-30" id="__codelineno-10-30" name="__codelineno-10-30"></a><span class="cm">/* デストラクタ */</span>
<a href="#__codelineno-10-31" id="__codelineno-10-31" name="__codelineno-10-31"></a><span class="kt">void</span><span class="w"> </span><span class="nf">delHashMapChaining</span><span class="p">(</span><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-32" id="__codelineno-10-32" name="__codelineno-10-32"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-33" id="__codelineno-10-33" name="__codelineno-10-33"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<a href="#__codelineno-10-34" id="__codelineno-10-34" name="__codelineno-10-34"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">cur</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-35" id="__codelineno-10-35" name="__codelineno-10-35"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="n">tmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="p">;</span>
<a href="#__codelineno-10-36" id="__codelineno-10-36" name="__codelineno-10-36"></a><span class="w"> </span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
<a href="#__codelineno-10-37" id="__codelineno-10-37" name="__codelineno-10-37"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">tmp</span><span class="o">-&gt;</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-10-38" id="__codelineno-10-38" name="__codelineno-10-38"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">tmp</span><span class="p">);</span>
<a href="#__codelineno-10-39" id="__codelineno-10-39" name="__codelineno-10-39"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-40" id="__codelineno-10-40" name="__codelineno-10-40"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-41" id="__codelineno-10-41" name="__codelineno-10-41"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">);</span>
<a href="#__codelineno-10-42" id="__codelineno-10-42" name="__codelineno-10-42"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">hashMap</span><span class="p">);</span>
<a href="#__codelineno-10-43" id="__codelineno-10-43" name="__codelineno-10-43"></a><span class="p">}</span>
<a href="#__codelineno-10-44" id="__codelineno-10-44" name="__codelineno-10-44"></a>
<a href="#__codelineno-10-45" id="__codelineno-10-45" name="__codelineno-10-45"></a><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-10-46" id="__codelineno-10-46" name="__codelineno-10-46"></a><span class="kt">int</span><span class="w"> </span><span class="nf">hashFunc</span><span class="p">(</span><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-47" id="__codelineno-10-47" name="__codelineno-10-47"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-10-48" id="__codelineno-10-48" name="__codelineno-10-48"></a><span class="p">}</span>
<a href="#__codelineno-10-49" id="__codelineno-10-49" name="__codelineno-10-49"></a>
<a href="#__codelineno-10-50" id="__codelineno-10-50" name="__codelineno-10-50"></a><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-10-51" id="__codelineno-10-51" name="__codelineno-10-51"></a><span class="kt">double</span><span class="w"> </span><span class="nf">loadFactor</span><span class="p">(</span><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-52" id="__codelineno-10-52" name="__codelineno-10-52"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-10-53" id="__codelineno-10-53" name="__codelineno-10-53"></a><span class="p">}</span>
<a href="#__codelineno-10-54" id="__codelineno-10-54" name="__codelineno-10-54"></a>
<a href="#__codelineno-10-55" id="__codelineno-10-55" name="__codelineno-10-55"></a><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-10-56" id="__codelineno-10-56" name="__codelineno-10-56"></a><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="nf">get</span><span class="p">(</span><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-57" id="__codelineno-10-57" name="__codelineno-10-57"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-10-58" id="__codelineno-10-58" name="__codelineno-10-58"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-10-59" id="__codelineno-10-59" name="__codelineno-10-59"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-10-60" id="__codelineno-10-60" name="__codelineno-10-60"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">cur</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-61" id="__codelineno-10-61" name="__codelineno-10-61"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-62" id="__codelineno-10-62" name="__codelineno-10-62"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-10-63" id="__codelineno-10-63" name="__codelineno-10-63"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-64" id="__codelineno-10-64" name="__codelineno-10-64"></a><span class="w"> </span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
<a href="#__codelineno-10-65" id="__codelineno-10-65" name="__codelineno-10-65"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-66" id="__codelineno-10-66" name="__codelineno-10-66"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s">""</span><span class="p">;</span><span class="w"> </span><span class="c1">// key が見つからなかった場合、空文字列を返す</span>
<a href="#__codelineno-10-67" id="__codelineno-10-67" name="__codelineno-10-67"></a><span class="p">}</span>
<a href="#__codelineno-10-68" id="__codelineno-10-68" name="__codelineno-10-68"></a>
<a href="#__codelineno-10-69" id="__codelineno-10-69" name="__codelineno-10-69"></a><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-10-70" id="__codelineno-10-70" name="__codelineno-10-70"></a><span class="kt">void</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-71" id="__codelineno-10-71" name="__codelineno-10-71"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-10-72" id="__codelineno-10-72" name="__codelineno-10-72"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">loadFactor</span><span class="p">(</span><span class="n">hashMap</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-73" id="__codelineno-10-73" name="__codelineno-10-73"></a><span class="w"> </span><span class="n">extend</span><span class="p">(</span><span class="n">hashMap</span><span class="p">);</span>
<a href="#__codelineno-10-74" id="__codelineno-10-74" name="__codelineno-10-74"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-75" id="__codelineno-10-75" name="__codelineno-10-75"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-10-76" id="__codelineno-10-76" name="__codelineno-10-76"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-10-77" id="__codelineno-10-77" name="__codelineno-10-77"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-10-78" id="__codelineno-10-78" name="__codelineno-10-78"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">cur</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-79" id="__codelineno-10-79" name="__codelineno-10-79"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-80" id="__codelineno-10-80" name="__codelineno-10-80"></a><span class="w"> </span><span class="n">strcpy</span><span class="p">(</span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">);</span><span class="w"> </span><span class="c1">// 指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-10-81" id="__codelineno-10-81" name="__codelineno-10-81"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-10-82" id="__codelineno-10-82" name="__codelineno-10-82"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-83" id="__codelineno-10-83" name="__codelineno-10-83"></a><span class="w"> </span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
<a href="#__codelineno-10-84" id="__codelineno-10-84" name="__codelineno-10-84"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-85" id="__codelineno-10-85" name="__codelineno-10-85"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを連結リストの先頭に追加する</span>
<a href="#__codelineno-10-86" id="__codelineno-10-86" name="__codelineno-10-86"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">newPair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">Pair</span><span class="p">));</span>
<a href="#__codelineno-10-87" id="__codelineno-10-87" name="__codelineno-10-87"></a><span class="w"> </span><span class="n">newPair</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">key</span><span class="p">;</span>
<a href="#__codelineno-10-88" id="__codelineno-10-88" name="__codelineno-10-88"></a><span class="w"> </span><span class="n">strcpy</span><span class="p">(</span><span class="n">newPair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-10-89" id="__codelineno-10-89" name="__codelineno-10-89"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="n">newNode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">Node</span><span class="p">));</span>
<a href="#__codelineno-10-90" id="__codelineno-10-90" name="__codelineno-10-90"></a><span class="w"> </span><span class="n">newNode</span><span class="o">-&gt;</span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">newPair</span><span class="p">;</span>
<a href="#__codelineno-10-91" id="__codelineno-10-91" name="__codelineno-10-91"></a><span class="w"> </span><span class="n">newNode</span><span class="o">-&gt;</span><span class="n">next</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-10-92" id="__codelineno-10-92" name="__codelineno-10-92"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">newNode</span><span class="p">;</span>
<a href="#__codelineno-10-93" id="__codelineno-10-93" name="__codelineno-10-93"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-10-94" id="__codelineno-10-94" name="__codelineno-10-94"></a><span class="p">}</span>
<a href="#__codelineno-10-95" id="__codelineno-10-95" name="__codelineno-10-95"></a>
<a href="#__codelineno-10-96" id="__codelineno-10-96" name="__codelineno-10-96"></a><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-10-97" id="__codelineno-10-97" name="__codelineno-10-97"></a><span class="kt">void</span><span class="w"> </span><span class="nf">extend</span><span class="p">(</span><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-98" id="__codelineno-10-98" name="__codelineno-10-98"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-10-99" id="__codelineno-10-99" name="__codelineno-10-99"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">oldCapacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-10-100" id="__codelineno-10-100" name="__codelineno-10-100"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">**</span><span class="n">oldBuckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">;</span>
<a href="#__codelineno-10-101" id="__codelineno-10-101" name="__codelineno-10-101"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-10-102" id="__codelineno-10-102" name="__codelineno-10-102"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">extendRatio</span><span class="p">;</span>
<a href="#__codelineno-10-103" id="__codelineno-10-103" name="__codelineno-10-103"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="o">**</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="p">));</span>
<a href="#__codelineno-10-104" id="__codelineno-10-104" name="__codelineno-10-104"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-105" id="__codelineno-10-105" name="__codelineno-10-105"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<a href="#__codelineno-10-106" id="__codelineno-10-106" name="__codelineno-10-106"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-107" id="__codelineno-10-107" name="__codelineno-10-107"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-10-108" id="__codelineno-10-108" name="__codelineno-10-108"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-10-109" id="__codelineno-10-109" name="__codelineno-10-109"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">oldCapacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-110" id="__codelineno-10-110" name="__codelineno-10-110"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">oldBuckets</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<a href="#__codelineno-10-111" id="__codelineno-10-111" name="__codelineno-10-111"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">cur</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-112" id="__codelineno-10-112" name="__codelineno-10-112"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-10-113" id="__codelineno-10-113" name="__codelineno-10-113"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="n">temp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="p">;</span>
<a href="#__codelineno-10-114" id="__codelineno-10-114" name="__codelineno-10-114"></a><span class="w"> </span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
<a href="#__codelineno-10-115" id="__codelineno-10-115" name="__codelineno-10-115"></a><span class="w"> </span><span class="c1">// メモリを解放する</span>
<a href="#__codelineno-10-116" id="__codelineno-10-116" name="__codelineno-10-116"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">temp</span><span class="o">-&gt;</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-10-117" id="__codelineno-10-117" name="__codelineno-10-117"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">temp</span><span class="p">);</span>
<a href="#__codelineno-10-118" id="__codelineno-10-118" name="__codelineno-10-118"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-119" id="__codelineno-10-119" name="__codelineno-10-119"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-120" id="__codelineno-10-120" name="__codelineno-10-120"></a>
<a href="#__codelineno-10-121" id="__codelineno-10-121" name="__codelineno-10-121"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">oldBuckets</span><span class="p">);</span>
<a href="#__codelineno-10-122" id="__codelineno-10-122" name="__codelineno-10-122"></a><span class="p">}</span>
<a href="#__codelineno-10-123" id="__codelineno-10-123" name="__codelineno-10-123"></a>
<a href="#__codelineno-10-124" id="__codelineno-10-124" name="__codelineno-10-124"></a><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-10-125" id="__codelineno-10-125" name="__codelineno-10-125"></a><span class="kt">void</span><span class="w"> </span><span class="nf">removeItem</span><span class="p">(</span><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-126" id="__codelineno-10-126" name="__codelineno-10-126"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-10-127" id="__codelineno-10-127" name="__codelineno-10-127"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-10-128" id="__codelineno-10-128" name="__codelineno-10-128"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="n">pre</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">;</span>
<a href="#__codelineno-10-129" id="__codelineno-10-129" name="__codelineno-10-129"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">cur</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-130" id="__codelineno-10-130" name="__codelineno-10-130"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-131" id="__codelineno-10-131" name="__codelineno-10-131"></a><span class="w"> </span><span class="c1">// キーと値のペアを削除する</span>
<a href="#__codelineno-10-132" id="__codelineno-10-132" name="__codelineno-10-132"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pre</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-133" id="__codelineno-10-133" name="__codelineno-10-133"></a><span class="w"> </span><span class="n">pre</span><span class="o">-&gt;</span><span class="n">next</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
<a href="#__codelineno-10-134" id="__codelineno-10-134" name="__codelineno-10-134"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-135" id="__codelineno-10-135" name="__codelineno-10-135"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
<a href="#__codelineno-10-136" id="__codelineno-10-136" name="__codelineno-10-136"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-137" id="__codelineno-10-137" name="__codelineno-10-137"></a><span class="w"> </span><span class="c1">// メモリを解放する</span>
<a href="#__codelineno-10-138" id="__codelineno-10-138" name="__codelineno-10-138"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-10-139" id="__codelineno-10-139" name="__codelineno-10-139"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">cur</span><span class="p">);</span>
<a href="#__codelineno-10-140" id="__codelineno-10-140" name="__codelineno-10-140"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-10-141" id="__codelineno-10-141" name="__codelineno-10-141"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-10-142" id="__codelineno-10-142" name="__codelineno-10-142"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-143" id="__codelineno-10-143" name="__codelineno-10-143"></a><span class="w"> </span><span class="n">pre</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="p">;</span>
<a href="#__codelineno-10-144" id="__codelineno-10-144" name="__codelineno-10-144"></a><span class="w"> </span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
<a href="#__codelineno-10-145" id="__codelineno-10-145" name="__codelineno-10-145"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-146" id="__codelineno-10-146" name="__codelineno-10-146"></a><span class="p">}</span>
<a href="#__codelineno-10-147" id="__codelineno-10-147" name="__codelineno-10-147"></a>
<a href="#__codelineno-10-148" id="__codelineno-10-148" name="__codelineno-10-148"></a><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-10-149" id="__codelineno-10-149" name="__codelineno-10-149"></a><span class="kt">void</span><span class="w"> </span><span class="nf">print</span><span class="p">(</span><span class="n">HashMapChaining</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-150" id="__codelineno-10-150" name="__codelineno-10-150"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-151" id="__codelineno-10-151" name="__codelineno-10-151"></a><span class="w"> </span><span class="n">Node</span><span class="w"> </span><span class="o">*</span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<a href="#__codelineno-10-152" id="__codelineno-10-152" name="__codelineno-10-152"></a><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"["</span><span class="p">);</span>
<a href="#__codelineno-10-153" id="__codelineno-10-153" name="__codelineno-10-153"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">cur</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-10-154" id="__codelineno-10-154" name="__codelineno-10-154"></a><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"%d -&gt; %s, "</span><span class="p">,</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-10-155" id="__codelineno-10-155" name="__codelineno-10-155"></a><span class="w"> </span><span class="n">cur</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cur</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">;</span>
<a href="#__codelineno-10-156" id="__codelineno-10-156" name="__codelineno-10-156"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-157" id="__codelineno-10-157" name="__codelineno-10-157"></a><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"]</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<a href="#__codelineno-10-158" id="__codelineno-10-158" name="__codelineno-10-158"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-10-159" id="__codelineno-10-159" name="__codelineno-10-159"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.kt</span><pre><span></span><code><a href="#__codelineno-11-1" id="__codelineno-11-1" name="__codelineno-11-1"></a><span class="cm">/* チェイン法のハッシュテーブル */</span>
<a href="#__codelineno-11-2" id="__codelineno-11-2" name="__codelineno-11-2"></a><span class="kd">class</span><span class="w"> </span><span class="nc">HashMapChaining</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-3" id="__codelineno-11-3" name="__codelineno-11-3"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">size</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-11-4" id="__codelineno-11-4" name="__codelineno-11-4"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">capacity</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-11-5" id="__codelineno-11-5" name="__codelineno-11-5"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">loadThres</span><span class="p">:</span><span class="w"> </span><span class="kt">Double</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-11-6" id="__codelineno-11-6" name="__codelineno-11-6"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">extendRatio</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-11-7" id="__codelineno-11-7" name="__codelineno-11-7"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">buckets</span><span class="p">:</span><span class="w"> </span><span class="n">MutableList</span><span class="o">&lt;</span><span class="n">MutableList</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-11-8" id="__codelineno-11-8" name="__codelineno-11-8"></a>
<a href="#__codelineno-11-9" id="__codelineno-11-9" name="__codelineno-11-9"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-11-10" id="__codelineno-11-10" name="__codelineno-11-10"></a><span class="w"> </span><span class="k">init</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-11" id="__codelineno-11-11" name="__codelineno-11-11"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span>
<a href="#__codelineno-11-12" id="__codelineno-11-12" name="__codelineno-11-12"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span>
<a href="#__codelineno-11-13" id="__codelineno-11-13" name="__codelineno-11-13"></a><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">3.0</span>
<a href="#__codelineno-11-14" id="__codelineno-11-14" name="__codelineno-11-14"></a><span class="w"> </span><span class="n">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span>
<a href="#__codelineno-11-15" id="__codelineno-11-15" name="__codelineno-11-15"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mutableListOf</span><span class="p">()</span>
<a href="#__codelineno-11-16" id="__codelineno-11-16" name="__codelineno-11-16"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">0.</span><span class="p">.</span><span class="o">&lt;</span><span class="n">capacity</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-17" id="__codelineno-11-17" name="__codelineno-11-17"></a><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">mutableListOf</span><span class="p">())</span>
<a href="#__codelineno-11-18" id="__codelineno-11-18" name="__codelineno-11-18"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-19" id="__codelineno-11-19" name="__codelineno-11-19"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-20" id="__codelineno-11-20" name="__codelineno-11-20"></a>
<a href="#__codelineno-11-21" id="__codelineno-11-21" name="__codelineno-11-21"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-11-22" id="__codelineno-11-22" name="__codelineno-11-22"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">):</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-23" id="__codelineno-11-23" name="__codelineno-11-23"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span>
<a href="#__codelineno-11-24" id="__codelineno-11-24" name="__codelineno-11-24"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-25" id="__codelineno-11-25" name="__codelineno-11-25"></a>
<a href="#__codelineno-11-26" id="__codelineno-11-26" name="__codelineno-11-26"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-11-27" id="__codelineno-11-27" name="__codelineno-11-27"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">loadFactor</span><span class="p">():</span><span class="w"> </span><span class="kt">Double</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-28" id="__codelineno-11-28" name="__codelineno-11-28"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">capacity</span><span class="p">).</span><span class="na">toDouble</span><span class="p">()</span>
<a href="#__codelineno-11-29" id="__codelineno-11-29" name="__codelineno-11-29"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-30" id="__codelineno-11-30" name="__codelineno-11-30"></a>
<a href="#__codelineno-11-31" id="__codelineno-11-31" name="__codelineno-11-31"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-11-32" id="__codelineno-11-32" name="__codelineno-11-32"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">):</span><span class="w"> </span><span class="kt">String?</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-33" id="__codelineno-11-33" name="__codelineno-11-33"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-11-34" id="__codelineno-11-34" name="__codelineno-11-34"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span>
<a href="#__codelineno-11-35" id="__codelineno-11-35" name="__codelineno-11-35"></a><span class="w"> </span><span class="c1">// バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-11-36" id="__codelineno-11-36" name="__codelineno-11-36"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-37" id="__codelineno-11-37" name="__codelineno-11-37"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">_val</span>
<a href="#__codelineno-11-38" id="__codelineno-11-38" name="__codelineno-11-38"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-39" id="__codelineno-11-39" name="__codelineno-11-39"></a><span class="w"> </span><span class="c1">// key が見つからなかった場合、null を返す</span>
<a href="#__codelineno-11-40" id="__codelineno-11-40" name="__codelineno-11-40"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span>
<a href="#__codelineno-11-41" id="__codelineno-11-41" name="__codelineno-11-41"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-42" id="__codelineno-11-42" name="__codelineno-11-42"></a>
<a href="#__codelineno-11-43" id="__codelineno-11-43" name="__codelineno-11-43"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-11-44" id="__codelineno-11-44" name="__codelineno-11-44"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">,</span><span class="w"> </span><span class="n">_val</span><span class="p">:</span><span class="w"> </span><span class="kt">String</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-45" id="__codelineno-11-45" name="__codelineno-11-45"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-11-46" id="__codelineno-11-46" name="__codelineno-11-46"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-47" id="__codelineno-11-47" name="__codelineno-11-47"></a><span class="w"> </span><span class="n">extend</span><span class="p">()</span>
<a href="#__codelineno-11-48" id="__codelineno-11-48" name="__codelineno-11-48"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-49" id="__codelineno-11-49" name="__codelineno-11-49"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-11-50" id="__codelineno-11-50" name="__codelineno-11-50"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span>
<a href="#__codelineno-11-51" id="__codelineno-11-51" name="__codelineno-11-51"></a><span class="w"> </span><span class="c1">// バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-11-52" id="__codelineno-11-52" name="__codelineno-11-52"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-53" id="__codelineno-11-53" name="__codelineno-11-53"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-54" id="__codelineno-11-54" name="__codelineno-11-54"></a><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">_val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_val</span>
<a href="#__codelineno-11-55" id="__codelineno-11-55" name="__codelineno-11-55"></a><span class="w"> </span><span class="k">return</span>
<a href="#__codelineno-11-56" id="__codelineno-11-56" name="__codelineno-11-56"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-57" id="__codelineno-11-57" name="__codelineno-11-57"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-58" id="__codelineno-11-58" name="__codelineno-11-58"></a><span class="w"> </span><span class="c1">// key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-11-59" id="__codelineno-11-59" name="__codelineno-11-59"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">_val</span><span class="p">)</span>
<a href="#__codelineno-11-60" id="__codelineno-11-60" name="__codelineno-11-60"></a><span class="w"> </span><span class="n">bucket</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">pair</span><span class="p">)</span>
<a href="#__codelineno-11-61" id="__codelineno-11-61" name="__codelineno-11-61"></a><span class="w"> </span><span class="n">size</span><span class="o">++</span>
<a href="#__codelineno-11-62" id="__codelineno-11-62" name="__codelineno-11-62"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-63" id="__codelineno-11-63" name="__codelineno-11-63"></a>
<a href="#__codelineno-11-64" id="__codelineno-11-64" name="__codelineno-11-64"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-11-65" id="__codelineno-11-65" name="__codelineno-11-65"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-66" id="__codelineno-11-66" name="__codelineno-11-66"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-11-67" id="__codelineno-11-67" name="__codelineno-11-67"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span>
<a href="#__codelineno-11-68" id="__codelineno-11-68" name="__codelineno-11-68"></a><span class="w"> </span><span class="c1">// バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-11-69" id="__codelineno-11-69" name="__codelineno-11-69"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-70" id="__codelineno-11-70" name="__codelineno-11-70"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-71" id="__codelineno-11-71" name="__codelineno-11-71"></a><span class="w"> </span><span class="n">bucket</span><span class="p">.</span><span class="na">remove</span><span class="p">(</span><span class="n">pair</span><span class="p">)</span>
<a href="#__codelineno-11-72" id="__codelineno-11-72" name="__codelineno-11-72"></a><span class="w"> </span><span class="n">size</span><span class="o">--</span>
<a href="#__codelineno-11-73" id="__codelineno-11-73" name="__codelineno-11-73"></a><span class="w"> </span><span class="k">break</span>
<a href="#__codelineno-11-74" id="__codelineno-11-74" name="__codelineno-11-74"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-75" id="__codelineno-11-75" name="__codelineno-11-75"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-76" id="__codelineno-11-76" name="__codelineno-11-76"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-77" id="__codelineno-11-77" name="__codelineno-11-77"></a>
<a href="#__codelineno-11-78" id="__codelineno-11-78" name="__codelineno-11-78"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-11-79" id="__codelineno-11-79" name="__codelineno-11-79"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-80" id="__codelineno-11-80" name="__codelineno-11-80"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-11-81" id="__codelineno-11-81" name="__codelineno-11-81"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span>
<a href="#__codelineno-11-82" id="__codelineno-11-82" name="__codelineno-11-82"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-11-83" id="__codelineno-11-83" name="__codelineno-11-83"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span>
<a href="#__codelineno-11-84" id="__codelineno-11-84" name="__codelineno-11-84"></a><span class="w"> </span><span class="c1">// mutablelist のサイズは固定ではない</span>
<a href="#__codelineno-11-85" id="__codelineno-11-85" name="__codelineno-11-85"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mutableListOf</span><span class="p">()</span>
<a href="#__codelineno-11-86" id="__codelineno-11-86" name="__codelineno-11-86"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="m">0.</span><span class="p">.</span><span class="o">&lt;</span><span class="n">capacity</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-87" id="__codelineno-11-87" name="__codelineno-11-87"></a><span class="w"> </span><span class="n">buckets</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">mutableListOf</span><span class="p">())</span>
<a href="#__codelineno-11-88" id="__codelineno-11-88" name="__codelineno-11-88"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-89" id="__codelineno-11-89" name="__codelineno-11-89"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span>
<a href="#__codelineno-11-90" id="__codelineno-11-90" name="__codelineno-11-90"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-11-91" id="__codelineno-11-91" name="__codelineno-11-91"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-92" id="__codelineno-11-92" name="__codelineno-11-92"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-93" id="__codelineno-11-93" name="__codelineno-11-93"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">_val</span><span class="p">)</span>
<a href="#__codelineno-11-94" id="__codelineno-11-94" name="__codelineno-11-94"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-95" id="__codelineno-11-95" name="__codelineno-11-95"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-96" id="__codelineno-11-96" name="__codelineno-11-96"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-97" id="__codelineno-11-97" name="__codelineno-11-97"></a>
<a href="#__codelineno-11-98" id="__codelineno-11-98" name="__codelineno-11-98"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-11-99" id="__codelineno-11-99" name="__codelineno-11-99"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-100" id="__codelineno-11-100" name="__codelineno-11-100"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-101" id="__codelineno-11-101" name="__codelineno-11-101"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">mutableListOf</span><span class="o">&lt;</span><span class="kt">String</span><span class="o">&gt;</span><span class="p">()</span>
<a href="#__codelineno-11-102" id="__codelineno-11-102" name="__codelineno-11-102"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-11-103" id="__codelineno-11-103" name="__codelineno-11-103"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">k</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">key</span>
<a href="#__codelineno-11-104" id="__codelineno-11-104" name="__codelineno-11-104"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">v</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">_val</span>
<a href="#__codelineno-11-105" id="__codelineno-11-105" name="__codelineno-11-105"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="s">"</span><span class="si">$</span><span class="n">k</span><span class="s"> -&gt; </span><span class="si">$</span><span class="n">v</span><span class="s">"</span><span class="p">)</span>
<a href="#__codelineno-11-106" id="__codelineno-11-106" name="__codelineno-11-106"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-107" id="__codelineno-11-107" name="__codelineno-11-107"></a><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="n">res</span><span class="p">)</span>
<a href="#__codelineno-11-108" id="__codelineno-11-108" name="__codelineno-11-108"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-109" id="__codelineno-11-109" name="__codelineno-11-109"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-11-110" id="__codelineno-11-110" name="__codelineno-11-110"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_chaining.rb</span><pre><span></span><code><a href="#__codelineno-12-1" id="__codelineno-12-1" name="__codelineno-12-1"></a><span class="c1">### チェイン法のハッシュテーブル ###</span>
<a href="#__codelineno-12-2" id="__codelineno-12-2" name="__codelineno-12-2"></a><span class="k">class</span><span class="w"> </span><span class="nc">HashMapChaining</span>
<a href="#__codelineno-12-3" id="__codelineno-12-3" name="__codelineno-12-3"></a><span class="w"> </span><span class="c1">### コンストラクタ ###</span>
<a href="#__codelineno-12-4" id="__codelineno-12-4" name="__codelineno-12-4"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span>
<a href="#__codelineno-12-5" id="__codelineno-12-5" name="__codelineno-12-5"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="c1"># キーと値のペアの数</span>
<a href="#__codelineno-12-6" id="__codelineno-12-6" name="__codelineno-12-6"></a><span class="w"> </span><span class="vi">@capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="c1"># ハッシュテーブルの容量</span>
<a href="#__codelineno-12-7" id="__codelineno-12-7" name="__codelineno-12-7"></a><span class="w"> </span><span class="vi">@load_thres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="o">.</span><span class="mi">0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">3</span><span class="o">.</span><span class="mi">0</span><span class="w"> </span><span class="c1"># 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-12-8" id="__codelineno-12-8" name="__codelineno-12-8"></a><span class="w"> </span><span class="vi">@extend_ratio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="c1"># 容量の拡張倍率</span>
<a href="#__codelineno-12-9" id="__codelineno-12-9" name="__codelineno-12-9"></a><span class="w"> </span><span class="vi">@buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="vi">@capacity</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="c1"># バケット配列</span>
<a href="#__codelineno-12-10" id="__codelineno-12-10" name="__codelineno-12-10"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-11" id="__codelineno-12-11" name="__codelineno-12-11"></a>
<a href="#__codelineno-12-12" id="__codelineno-12-12" name="__codelineno-12-12"></a><span class="w"> </span><span class="c1">### ハッシュ関数 ###</span>
<a href="#__codelineno-12-13" id="__codelineno-12-13" name="__codelineno-12-13"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-12-14" id="__codelineno-12-14" name="__codelineno-12-14"></a><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="vi">@capacity</span>
<a href="#__codelineno-12-15" id="__codelineno-12-15" name="__codelineno-12-15"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-16" id="__codelineno-12-16" name="__codelineno-12-16"></a>
<a href="#__codelineno-12-17" id="__codelineno-12-17" name="__codelineno-12-17"></a><span class="w"> </span><span class="c1">### 負荷率 ###</span>
<a href="#__codelineno-12-18" id="__codelineno-12-18" name="__codelineno-12-18"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">load_factor</span>
<a href="#__codelineno-12-19" id="__codelineno-12-19" name="__codelineno-12-19"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="vi">@capacity</span>
<a href="#__codelineno-12-20" id="__codelineno-12-20" name="__codelineno-12-20"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-21" id="__codelineno-12-21" name="__codelineno-12-21"></a>
<a href="#__codelineno-12-22" id="__codelineno-12-22" name="__codelineno-12-22"></a><span class="w"> </span><span class="c1">### 取得操作 ###</span>
<a href="#__codelineno-12-23" id="__codelineno-12-23" name="__codelineno-12-23"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-12-24" id="__codelineno-12-24" name="__codelineno-12-24"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-12-25" id="__codelineno-12-25" name="__codelineno-12-25"></a><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span>
<a href="#__codelineno-12-26" id="__codelineno-12-26" name="__codelineno-12-26"></a><span class="w"> </span><span class="c1"># バケットを走査し、key が見つかったら対応する val を返す</span>
<a href="#__codelineno-12-27" id="__codelineno-12-27" name="__codelineno-12-27"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span>
<a href="#__codelineno-12-28" id="__codelineno-12-28" name="__codelineno-12-28"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">pair</span><span class="o">.</span><span class="n">val</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span>
<a href="#__codelineno-12-29" id="__codelineno-12-29" name="__codelineno-12-29"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-30" id="__codelineno-12-30" name="__codelineno-12-30"></a><span class="w"> </span><span class="c1"># key が見つからなかった場合、nil を返す</span>
<a href="#__codelineno-12-31" id="__codelineno-12-31" name="__codelineno-12-31"></a><span class="w"> </span><span class="kp">nil</span>
<a href="#__codelineno-12-32" id="__codelineno-12-32" name="__codelineno-12-32"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-33" id="__codelineno-12-33" name="__codelineno-12-33"></a>
<a href="#__codelineno-12-34" id="__codelineno-12-34" name="__codelineno-12-34"></a><span class="w"> </span><span class="c1">### 追加操作 ###</span>
<a href="#__codelineno-12-35" id="__codelineno-12-35" name="__codelineno-12-35"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-12-36" id="__codelineno-12-36" name="__codelineno-12-36"></a><span class="w"> </span><span class="c1"># 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-12-37" id="__codelineno-12-37" name="__codelineno-12-37"></a><span class="w"> </span><span class="kp">extend</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">load_factor</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="vi">@load_thres</span>
<a href="#__codelineno-12-38" id="__codelineno-12-38" name="__codelineno-12-38"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-12-39" id="__codelineno-12-39" name="__codelineno-12-39"></a><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span>
<a href="#__codelineno-12-40" id="__codelineno-12-40" name="__codelineno-12-40"></a><span class="w"> </span><span class="c1"># バケットを走査し、指定された key が見つかったら、対応する val を更新して戻る</span>
<a href="#__codelineno-12-41" id="__codelineno-12-41" name="__codelineno-12-41"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span>
<a href="#__codelineno-12-42" id="__codelineno-12-42" name="__codelineno-12-42"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span>
<a href="#__codelineno-12-43" id="__codelineno-12-43" name="__codelineno-12-43"></a><span class="w"> </span><span class="n">pair</span><span class="o">.</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span>
<a href="#__codelineno-12-44" id="__codelineno-12-44" name="__codelineno-12-44"></a><span class="w"> </span><span class="k">return</span>
<a href="#__codelineno-12-45" id="__codelineno-12-45" name="__codelineno-12-45"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-46" id="__codelineno-12-46" name="__codelineno-12-46"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-47" id="__codelineno-12-47" name="__codelineno-12-47"></a><span class="w"> </span><span class="c1"># key が存在しない場合、キーと値のペアを末尾に追加する</span>
<a href="#__codelineno-12-48" id="__codelineno-12-48" name="__codelineno-12-48"></a><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Pair</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-12-49" id="__codelineno-12-49" name="__codelineno-12-49"></a><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">pair</span>
<a href="#__codelineno-12-50" id="__codelineno-12-50" name="__codelineno-12-50"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span>
<a href="#__codelineno-12-51" id="__codelineno-12-51" name="__codelineno-12-51"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-52" id="__codelineno-12-52" name="__codelineno-12-52"></a>
<a href="#__codelineno-12-53" id="__codelineno-12-53" name="__codelineno-12-53"></a><span class="w"> </span><span class="c1">### 削除操作 ###</span>
<a href="#__codelineno-12-54" id="__codelineno-12-54" name="__codelineno-12-54"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-12-55" id="__codelineno-12-55" name="__codelineno-12-55"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-12-56" id="__codelineno-12-56" name="__codelineno-12-56"></a><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span>
<a href="#__codelineno-12-57" id="__codelineno-12-57" name="__codelineno-12-57"></a><span class="w"> </span><span class="c1"># バケットを走査し、キーと値のペアを削除する</span>
<a href="#__codelineno-12-58" id="__codelineno-12-58" name="__codelineno-12-58"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span>
<a href="#__codelineno-12-59" id="__codelineno-12-59" name="__codelineno-12-59"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span>
<a href="#__codelineno-12-60" id="__codelineno-12-60" name="__codelineno-12-60"></a><span class="w"> </span><span class="n">bucket</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="n">pair</span><span class="p">)</span>
<a href="#__codelineno-12-61" id="__codelineno-12-61" name="__codelineno-12-61"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span>
<a href="#__codelineno-12-62" id="__codelineno-12-62" name="__codelineno-12-62"></a><span class="w"> </span><span class="k">break</span>
<a href="#__codelineno-12-63" id="__codelineno-12-63" name="__codelineno-12-63"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-64" id="__codelineno-12-64" name="__codelineno-12-64"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-65" id="__codelineno-12-65" name="__codelineno-12-65"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-66" id="__codelineno-12-66" name="__codelineno-12-66"></a>
<a href="#__codelineno-12-67" id="__codelineno-12-67" name="__codelineno-12-67"></a><span class="w"> </span><span class="c1">### ハッシュテーブルの容量を拡張する ###</span>
<a href="#__codelineno-12-68" id="__codelineno-12-68" name="__codelineno-12-68"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">extend</span>
<a href="#__codelineno-12-69" id="__codelineno-12-69" name="__codelineno-12-69"></a><span class="w"> </span><span class="c1"># 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-12-70" id="__codelineno-12-70" name="__codelineno-12-70"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@buckets</span>
<a href="#__codelineno-12-71" id="__codelineno-12-71" name="__codelineno-12-71"></a><span class="w"> </span><span class="c1"># 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-12-72" id="__codelineno-12-72" name="__codelineno-12-72"></a><span class="w"> </span><span class="vi">@capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="vi">@extend_ratio</span>
<a href="#__codelineno-12-73" id="__codelineno-12-73" name="__codelineno-12-73"></a><span class="w"> </span><span class="vi">@buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="vi">@capacity</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-12-74" id="__codelineno-12-74" name="__codelineno-12-74"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
<a href="#__codelineno-12-75" id="__codelineno-12-75" name="__codelineno-12-75"></a><span class="w"> </span><span class="c1"># キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-12-76" id="__codelineno-12-76" name="__codelineno-12-76"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span>
<a href="#__codelineno-12-77" id="__codelineno-12-77" name="__codelineno-12-77"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span>
<a href="#__codelineno-12-78" id="__codelineno-12-78" name="__codelineno-12-78"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-12-79" id="__codelineno-12-79" name="__codelineno-12-79"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-80" id="__codelineno-12-80" name="__codelineno-12-80"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-81" id="__codelineno-12-81" name="__codelineno-12-81"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-82" id="__codelineno-12-82" name="__codelineno-12-82"></a>
<a href="#__codelineno-12-83" id="__codelineno-12-83" name="__codelineno-12-83"></a><span class="w"> </span><span class="c1">### ハッシュテーブルを表示する ###</span>
<a href="#__codelineno-12-84" id="__codelineno-12-84" name="__codelineno-12-84"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">print</span>
<a href="#__codelineno-12-85" id="__codelineno-12-85" name="__codelineno-12-85"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">bucket</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="vi">@buckets</span>
<a href="#__codelineno-12-86" id="__codelineno-12-86" name="__codelineno-12-86"></a><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">[]</span>
<a href="#__codelineno-12-87" id="__codelineno-12-87" name="__codelineno-12-87"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucket</span>
<a href="#__codelineno-12-88" id="__codelineno-12-88" name="__codelineno-12-88"></a><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s2">"</span><span class="si">#{</span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">#{</span><span class="n">pair</span><span class="o">.</span><span class="n">val</span><span class="si">}</span><span class="s2">"</span>
<a href="#__codelineno-12-89" id="__codelineno-12-89" name="__codelineno-12-89"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-90" id="__codelineno-12-90" name="__codelineno-12-90"></a><span class="w"> </span><span class="n">pp</span><span class="w"> </span><span class="n">res</span>
<a href="#__codelineno-12-91" id="__codelineno-12-91" name="__codelineno-12-91"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-92" id="__codelineno-12-92" name="__codelineno-12-92"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-12-93" id="__codelineno-12-93" name="__codelineno-12-93"></a><span class="k">end</span>
</code></pre></div>
</div>
</div>
</div>
<details class="pythontutor">
<summary>実行の可視化</summary>
<p><div style="height: 549px; width: 100%;"><iframe class="pythontutor-iframe" src="https://pythontutor.com/iframe-embed.html#code=class%20Pair%3A%0A%20%20%22%22%22%E3%82%AD%E3%83%BC%E3%81%A8%E5%80%A4%E3%81%AE%E3%83%9A%E3%82%A2%22%22%22%0A%20%20def%20__init__%28self,%20key%3A%20int,%20val%3A%20str%29%3A%0A%20%20%20%20self.key%20%3D%20key%0A%20%20%20%20self.val%20%3D%20val%0A%0Aclass%20HashMapChaining%3A%0A%20%20%22%22%22%E3%83%81%E3%82%A7%E3%82%A4%E3%83%B3%E6%B3%95%E3%81%AE%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%22%22%22%0A%0A%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%22%22%22%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF%22%22%22%0A%20%20%20%20self.size%20%3D%200%0A%20%20%20%20self.capacity%20%3D%204%0A%20%20%20%20self.load_thres%20%3D%202.0%20/%203.0%0A%20%20%20%20self.extend_ratio%20%3D%202%0A%20%20%20%20self.buckets%20%3D%20%5B%5B%5D%20for%20_%20in%20range%28self.capacity%29%5D%0A%0A%20%20def%20hash_func%28self,%20key%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0%22%22%22%0A%20%20%20%20return%20key%20%25%20self.capacity%0A%0A%20%20def%20load_factor%28self%29%20-%3E%20float%3A%0A%20%20%20%20%22%22%22%E8%B2%A0%E8%8D%B7%E7%8E%87%22%22%22%0A%20%20%20%20return%20self.size%20/%20self.capacity%0A%0A%20%20def%20get%28self,%20key%3A%20int%29%20-%3E%20str%20%7C%20None%3A%0A%20%20%20%20%22%22%22%E5%8F%96%E5%BE%97%E6%93%8D%E4%BD%9C%22%22%22%0A%20%20%20%20index%20%3D%20self.hash_func%28key%29%0A%20%20%20%20bucket%20%3D%20self.buckets%5Bindex%5D%0A%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20if%20pair.key%20%3D%3D%20key%3A%0A%20%20%20%20%20%20%20%20return%20pair.val%0A%20%20%20%20return%20None%0A%0A%20%20def%20put%28self,%20key%3A%20int,%20val%3A%20str%29%3A%0A%20%20%20%20%22%22%22%E8%BF%BD%E5%8A%A0%E6%93%8D%E4%BD%9C%22%22%22%0A%20%20%20%20if%20self.load_factor%28%29%20%3E%20self.load_thres%3A%0A%20%20%20%20%20%20self.extend%28%29%0A%20%20%20%20index%20%3D%20self.hash_func%28key%29%0A%20%20%20%20bucket%20%3D%20self.buckets%5Bindex%5D%0A%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20if%20pair.key%20%3D%3D%20key%3A%0A%20%20%20%20%20%20%20%20pair.val%20%3D%20val%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20pair%20%3D%20Pair%28key,%20val%29%0A%20%20%20%20bucket.append%28pair%29%0A%20%20%20%20self.size%20%2B%3D%201%0A%0A%20%20def%20remove%28self,%20key%3A%20int%29%3A%0A%20%20%20%20%22%22%22%E5%89%8A%E9%99%A4%E6%93%8D%E4%BD%9C%22%22%22%0A%20%20%20%20index%20%3D%20self.hash_func%28key%29%0A%20%20%20%20bucket%20%3D%20self.buckets%5Bindex%5D%0A%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20if%20pair.key%20%3D%3D%20key%3A%0A%20%20%20%20%20%20%20%20bucket.remove%28pair%29%0A%20%20%20%20%20%20%20%20self.size%20-%3D%201%0A%20%20%20%20%20%20%20%20break%0A%0A%20%20def%20extend%28self%29%3A%0A%20%20%20%20%22%22%22%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E5%AE%B9%E9%87%8F%E3%82%92%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B%22%22%22%0A%20%20%20%20buckets%20%3D%20self.buckets%0A%20%20%20%20self.capacity%20%2A%3D%20self.extend_ratio%0A%20%20%20%20self.buckets%20%3D%20%5B%5B%5D%20for%20_%20in%20range%28self.capacity%29%5D%0A%20%20%20%20self.size%20%3D%200%0A%20%20%20%20for%20bucket%20in%20buckets%3A%0A%20%20%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20%20%20self.put%28pair.key,%20pair.val%29%0A%0A%20%20def%20print%28self%29%3A%0A%20%20%20%20%22%22%22%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%22%22%22%0A%20%20%20%20for%20bucket%20in%20self.buckets%3A%0A%20%20%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20%20%20res.append%28str%28pair.key%29%20%2B%20%22%20-%3E%20%22%20%2B%20pair.val%29%0A%20%20%20%20%20%20print%28res%29%0A%0A%0A%22%22%22%E5%AE%9F%E8%A1%8C%E7%94%A8%E3%82%B3%E3%83%BC%E3%83%89%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%23%20%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B%0A%20%20hashmap%20%3D%20HashMapChaining%28%29%0A%0A%20%20%23%20%E8%BF%BD%E5%8A%A0%E6%93%8D%E4%BD%9C%0A%20%20hashmap.put%2812836,%20%22%E5%B0%8F%E5%93%88%22%29%0A%20%20hashmap.put%2815937,%20%22%E5%B0%8F%E5%95%B0%22%29%0A%20%20hashmap.put%2816750,%20%22%E5%B0%8F%E7%AE%97%22%29%0A%20%20hashmap.put%2813276,%20%22%E5%B0%8F%E6%B3%95%22%29%0A%20%20hashmap.put%2810583,%20%22%E5%B0%8F%E9%B8%AD%22%29%0A%0A%20%20%23%20%E5%8F%96%E5%BE%97%E6%93%8D%E4%BD%9C%0A%20%20name%20%3D%20hashmap.get%2813276%29%0A%0A%20%20%23%20%E5%89%8A%E9%99%A4%E6%93%8D%E4%BD%9C%0A%20%20hashmap.remove%2812836%29&amp;codeDivHeight=472&amp;codeDivWidth=350&amp;cumulative=false&amp;curInstr=4&amp;heapPrimitives=nevernest&amp;origin=opt-frontend.js&amp;py=311&amp;rawInputLstJSON=%5B%5D&amp;textReferences=false" title="実行の可視化"> </iframe></div>
<div style="margin-top: 5px;"><a href="https://pythontutor.com/iframe-embed.html#code=class%20Pair%3A%0A%20%20%22%22%22%E3%82%AD%E3%83%BC%E3%81%A8%E5%80%A4%E3%81%AE%E3%83%9A%E3%82%A2%22%22%22%0A%20%20def%20__init__%28self,%20key%3A%20int,%20val%3A%20str%29%3A%0A%20%20%20%20self.key%20%3D%20key%0A%20%20%20%20self.val%20%3D%20val%0A%0Aclass%20HashMapChaining%3A%0A%20%20%22%22%22%E3%83%81%E3%82%A7%E3%82%A4%E3%83%B3%E6%B3%95%E3%81%AE%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%22%22%22%0A%0A%20%20def%20__init__%28self%29%3A%0A%20%20%20%20%22%22%22%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF%22%22%22%0A%20%20%20%20self.size%20%3D%200%0A%20%20%20%20self.capacity%20%3D%204%0A%20%20%20%20self.load_thres%20%3D%202.0%20/%203.0%0A%20%20%20%20self.extend_ratio%20%3D%202%0A%20%20%20%20self.buckets%20%3D%20%5B%5B%5D%20for%20_%20in%20range%28self.capacity%29%5D%0A%0A%20%20def%20hash_func%28self,%20key%3A%20int%29%20-%3E%20int%3A%0A%20%20%20%20%22%22%22%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0%22%22%22%0A%20%20%20%20return%20key%20%25%20self.capacity%0A%0A%20%20def%20load_factor%28self%29%20-%3E%20float%3A%0A%20%20%20%20%22%22%22%E8%B2%A0%E8%8D%B7%E7%8E%87%22%22%22%0A%20%20%20%20return%20self.size%20/%20self.capacity%0A%0A%20%20def%20get%28self,%20key%3A%20int%29%20-%3E%20str%20%7C%20None%3A%0A%20%20%20%20%22%22%22%E5%8F%96%E5%BE%97%E6%93%8D%E4%BD%9C%22%22%22%0A%20%20%20%20index%20%3D%20self.hash_func%28key%29%0A%20%20%20%20bucket%20%3D%20self.buckets%5Bindex%5D%0A%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20if%20pair.key%20%3D%3D%20key%3A%0A%20%20%20%20%20%20%20%20return%20pair.val%0A%20%20%20%20return%20None%0A%0A%20%20def%20put%28self,%20key%3A%20int,%20val%3A%20str%29%3A%0A%20%20%20%20%22%22%22%E8%BF%BD%E5%8A%A0%E6%93%8D%E4%BD%9C%22%22%22%0A%20%20%20%20if%20self.load_factor%28%29%20%3E%20self.load_thres%3A%0A%20%20%20%20%20%20self.extend%28%29%0A%20%20%20%20index%20%3D%20self.hash_func%28key%29%0A%20%20%20%20bucket%20%3D%20self.buckets%5Bindex%5D%0A%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20if%20pair.key%20%3D%3D%20key%3A%0A%20%20%20%20%20%20%20%20pair.val%20%3D%20val%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20pair%20%3D%20Pair%28key,%20val%29%0A%20%20%20%20bucket.append%28pair%29%0A%20%20%20%20self.size%20%2B%3D%201%0A%0A%20%20def%20remove%28self,%20key%3A%20int%29%3A%0A%20%20%20%20%22%22%22%E5%89%8A%E9%99%A4%E6%93%8D%E4%BD%9C%22%22%22%0A%20%20%20%20index%20%3D%20self.hash_func%28key%29%0A%20%20%20%20bucket%20%3D%20self.buckets%5Bindex%5D%0A%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20if%20pair.key%20%3D%3D%20key%3A%0A%20%20%20%20%20%20%20%20bucket.remove%28pair%29%0A%20%20%20%20%20%20%20%20self.size%20-%3D%201%0A%20%20%20%20%20%20%20%20break%0A%0A%20%20def%20extend%28self%29%3A%0A%20%20%20%20%22%22%22%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E5%AE%B9%E9%87%8F%E3%82%92%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B%22%22%22%0A%20%20%20%20buckets%20%3D%20self.buckets%0A%20%20%20%20self.capacity%20%2A%3D%20self.extend_ratio%0A%20%20%20%20self.buckets%20%3D%20%5B%5B%5D%20for%20_%20in%20range%28self.capacity%29%5D%0A%20%20%20%20self.size%20%3D%200%0A%20%20%20%20for%20bucket%20in%20buckets%3A%0A%20%20%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20%20%20self.put%28pair.key,%20pair.val%29%0A%0A%20%20def%20print%28self%29%3A%0A%20%20%20%20%22%22%22%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%22%22%22%0A%20%20%20%20for%20bucket%20in%20self.buckets%3A%0A%20%20%20%20%20%20res%20%3D%20%5B%5D%0A%20%20%20%20%20%20for%20pair%20in%20bucket%3A%0A%20%20%20%20%20%20%20%20res.append%28str%28pair.key%29%20%2B%20%22%20-%3E%20%22%20%2B%20pair.val%29%0A%20%20%20%20%20%20print%28res%29%0A%0A%0A%22%22%22%E5%AE%9F%E8%A1%8C%E7%94%A8%E3%82%B3%E3%83%BC%E3%83%89%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%23%20%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B%0A%20%20hashmap%20%3D%20HashMapChaining%28%29%0A%0A%20%20%23%20%E8%BF%BD%E5%8A%A0%E6%93%8D%E4%BD%9C%0A%20%20hashmap.put%2812836,%20%22%E5%B0%8F%E5%93%88%22%29%0A%20%20hashmap.put%2815937,%20%22%E5%B0%8F%E5%95%B0%22%29%0A%20%20hashmap.put%2816750,%20%22%E5%B0%8F%E7%AE%97%22%29%0A%20%20hashmap.put%2813276,%20%22%E5%B0%8F%E6%B3%95%22%29%0A%20%20hashmap.put%2810583,%20%22%E5%B0%8F%E9%B8%AD%22%29%0A%0A%20%20%23%20%E5%8F%96%E5%BE%97%E6%93%8D%E4%BD%9C%0A%20%20name%20%3D%20hashmap.get%2813276%29%0A%0A%20%20%23%20%E5%89%8A%E9%99%A4%E6%93%8D%E4%BD%9C%0A%20%20hashmap.remove%2812836%29&amp;codeDivHeight=800&amp;codeDivWidth=600&amp;cumulative=false&amp;curInstr=4&amp;heapPrimitives=nevernest&amp;origin=opt-frontend.js&amp;py=311&amp;rawInputLstJSON=%5B%5D&amp;textReferences=false" rel="noopener noreferrer" target="_blank">全画面で表示 &gt;</a></div></p>
</details>
<p>連結リストが長い場合、<span class="arithmatex">\(O(n)\)</span> の照会は効率が悪くなります。<strong>その場合、リストを AVL 木や赤黒木へ変換すれば</strong>、照会の時間計算量を <span class="arithmatex">\(O(\log n)\)</span> に改善できます。</p>
<h2 id="622">6.2.2   オープンアドレス法<a class="headerlink" href="#622" title="この見出しへのリンク"></a></h2>
<p><u>オープンアドレス法(open addressing)</u>は、追加のデータ構造を導入せず、複数回の探索で衝突に対処します。主な方法には線形探索法、平方探索法、複数のハッシュ関数を使う方法などがあります。</p>
<p>以下では線形探索法を例に、その仕組みを説明します。</p>
<h3 id="1">1.   線形探索法<a class="headerlink" href="#1" title="この見出しへのリンク"></a></h3>
<p>線形探索法は、一定の間隔で線形に探します。通常のハッシュテーブルとは操作が異なります。</p>
<ul>
<li><strong>要素の挿入</strong>:ハッシュ関数でバケットのインデックスを求め、すでに要素があれば、衝突位置から後ろへ一定間隔(通常は <span class="arithmatex">\(1\)</span>)で走査し、空のバケットを見つけて挿入します。</li>
<li><strong>要素の探索</strong>:衝突したら同じ間隔で後ろへ線形に走査し、目的の要素を見つけて <code>value</code> を返します。空のバケットに出会ったら、その要素は存在しないので <code>None</code> を返します。</li>
</ul>
<p>図 6-6 は、オープンアドレス法(線形探索法)におけるペアの分布です。このハッシュ関数では、下二桁が等しい <code>key</code> は同じバケットに写されます。線形探索によって、そのバケットと後続のバケットへ順に格納されます。</p>
<p><ha-svg-figure class="animation-figure" data-book-key="ja/chapter_hashing/hash_collision.assets/hash_table_linear_probing.png" data-dark-src="/assets/figure-svg/figures/bf8b03c4753a638f8df66b11.json" data-src="/assets/figure-svg/figures/494f585a1950cd3caa298174.json" style=";--figure-ratio:960.0/540.0"><object data="/ja/chapter_hashing/hash_collision.assets/hash_table_linear_probing.svg" data-theme="light" tabindex="-1" type="image/svg+xml">オープンアドレス法(線形探索法)でのキーと値のペアの分布</object><object data="/ja/chapter_hashing/hash_collision.assets/hash_table_linear_probing.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">オープンアドレス法(線形探索法)でのキーと値のペアの分布</object></ha-svg-figure></p>
<p align="center"> 図 6-6   オープンアドレス法(線形探索法)でのキーと値のペアの分布 </p>
<p>ただし、<strong>線形探索法では「クラスタリング」が起きやすくなります</strong>。連続して使用中の場所が長くなるほど、そこで衝突する確率が高まり、さらに塊が成長するという悪循環が生じます。その結果、追加、削除、照会、更新の効率が悪化します。</p>
<p><strong>オープンアドレス法では、要素を直接削除できないことにも注意が必要です</strong>。削除すると配列内に空のバケット <code>None</code> ができ、照会時の線形探索はそこで終了してしまいます。その先の要素に到達できなくなり、存在しないと誤判定する可能性があります。図 6-7 に示します。</p>
<p><ha-svg-figure class="animation-figure" data-book-key="ja/chapter_hashing/hash_collision.assets/hash_table_open_addressing_deletion.png" data-dark-src="/assets/figure-svg/figures/940f74100f367036164c30b1.json" data-src="/assets/figure-svg/figures/e084acd9ec6a0c41c4e3053e.json" style=";--figure-ratio:960.0/540.0"><object data="/ja/chapter_hashing/hash_collision.assets/hash_table_open_addressing_deletion.svg" data-theme="light" tabindex="-1" type="image/svg+xml">オープンアドレス法で削除すると起きる照会の問題</object><object data="/ja/chapter_hashing/hash_collision.assets/hash_table_open_addressing_deletion.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">オープンアドレス法で削除すると起きる照会の問題</object></ha-svg-figure></p>
<p align="center"> 図 6-7   オープンアドレス法で削除すると起きる照会の問題 </p>
<p>この問題には、<u>遅延削除(lazy deletion)</u>を使えます。要素を直接取り除かず、<strong>定数 <code>TOMBSTONE</code> でそのバケットに印を付けます</strong>。<code>None</code> と <code>TOMBSTONE</code> はどちらも空のバケットを表し、新しいペアを置けます。ただし、<code>TOMBSTONE</code> の先にはペアがある可能性があるため、線形探索を続ける必要があります。</p>
<p>一方、<strong>遅延削除は性能の悪化を早める可能性があります</strong>。削除のたびに印が増え、<code>TOMBSTONE</code> が多くなると、目的の要素までいくつも飛び越える必要が生じ、探索時間が長くなるためです。</p>
<p>そこで、線形探索で最初に出会った <code>TOMBSTONE</code> のインデックスを記録し、見つかった目的の要素と位置を交換します。照会や追加のたびに、要素が理想の位置、つまり探索開始位置に近いバケットへ移るため、照会効率を改善できます。</p>
<p>以下は、遅延削除を備えたオープンアドレス法(線形探索法)の実装です。領域を十分に活用するため、ハッシュテーブルを循環配列と見なし、末尾を越えたら先頭に戻って走査を続けます。</p>
<div class="tabbed-set tabbed-alternate" data-tabs="2:13"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio"/><input id="__tabbed_2_2" name="__tabbed_2" type="radio"/><input id="__tabbed_2_3" name="__tabbed_2" type="radio"/><input id="__tabbed_2_4" name="__tabbed_2" type="radio"/><input id="__tabbed_2_5" name="__tabbed_2" type="radio"/><input id="__tabbed_2_6" name="__tabbed_2" type="radio"/><input id="__tabbed_2_7" name="__tabbed_2" type="radio"/><input id="__tabbed_2_8" name="__tabbed_2" type="radio"/><input id="__tabbed_2_9" name="__tabbed_2" type="radio"/><input id="__tabbed_2_10" name="__tabbed_2" type="radio"/><input id="__tabbed_2_11" name="__tabbed_2" type="radio"/><input id="__tabbed_2_12" name="__tabbed_2" type="radio"/><input id="__tabbed_2_13" name="__tabbed_2" type="radio"/><div class="tabbed-labels"><label for="__tabbed_2_1">Python</label><label for="__tabbed_2_2">C++</label><label for="__tabbed_2_3">Java</label><label for="__tabbed_2_4">C#</label><label for="__tabbed_2_5">Go</label><label for="__tabbed_2_6">Swift</label><label for="__tabbed_2_7">JS</label><label for="__tabbed_2_8">TS</label><label for="__tabbed_2_9">Dart</label><label for="__tabbed_2_10">Rust</label><label for="__tabbed_2_11">C</label><label for="__tabbed_2_12">Kotlin</label><label for="__tabbed_2_13">Ruby</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.py</span><pre><span></span><code><a href="#__codelineno-13-1" id="__codelineno-13-1" name="__codelineno-13-1"></a><span class="k">class</span><span class="w"> </span><span class="nc">HashMapOpenAddressing</span><span class="p">:</span>
<a href="#__codelineno-13-2" id="__codelineno-13-2" name="__codelineno-13-2"></a><span class="w"> </span><span class="sd">"""オープンアドレス法のハッシュテーブル"""</span>
<a href="#__codelineno-13-3" id="__codelineno-13-3" name="__codelineno-13-3"></a>
<a href="#__codelineno-13-4" id="__codelineno-13-4" name="__codelineno-13-4"></a> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<a href="#__codelineno-13-5" id="__codelineno-13-5" name="__codelineno-13-5"></a><span class="w"> </span><span class="sd">"""コンストラクタ"""</span>
<a href="#__codelineno-13-6" id="__codelineno-13-6" name="__codelineno-13-6"></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="mi">0</span> <span class="c1"># キーと値のペアの数</span>
<a href="#__codelineno-13-7" id="__codelineno-13-7" name="__codelineno-13-7"></a> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span> <span class="o">=</span> <span class="mi">4</span> <span class="c1"># ハッシュテーブルの容量</span>
<a href="#__codelineno-13-8" id="__codelineno-13-8" name="__codelineno-13-8"></a> <span class="bp">self</span><span class="o">.</span><span class="n">load_thres</span> <span class="o">=</span> <span class="mf">2.0</span> <span class="o">/</span> <span class="mf">3.0</span> <span class="c1"># 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-13-9" id="__codelineno-13-9" name="__codelineno-13-9"></a> <span class="bp">self</span><span class="o">.</span><span class="n">extend_ratio</span> <span class="o">=</span> <span class="mi">2</span> <span class="c1"># 容量の拡張倍率</span>
<a href="#__codelineno-13-10" id="__codelineno-13-10" name="__codelineno-13-10"></a> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">Pair</span> <span class="o">|</span> <span class="kc">None</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span> <span class="c1"># バケット配列</span>
<a href="#__codelineno-13-11" id="__codelineno-13-11" name="__codelineno-13-11"></a> <span class="bp">self</span><span class="o">.</span><span class="n">TOMBSTONE</span> <span class="o">=</span> <span class="n">Pair</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="s2">"-1"</span><span class="p">)</span> <span class="c1"># 削除マーカー</span>
<a href="#__codelineno-13-12" id="__codelineno-13-12" name="__codelineno-13-12"></a>
<a href="#__codelineno-13-13" id="__codelineno-13-13" name="__codelineno-13-13"></a> <span class="k">def</span><span class="w"> </span><span class="nf">hash_func</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a href="#__codelineno-13-14" id="__codelineno-13-14" name="__codelineno-13-14"></a><span class="w"> </span><span class="sd">"""ハッシュ関数"""</span>
<a href="#__codelineno-13-15" id="__codelineno-13-15" name="__codelineno-13-15"></a> <span class="k">return</span> <span class="n">key</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span>
<a href="#__codelineno-13-16" id="__codelineno-13-16" name="__codelineno-13-16"></a>
<a href="#__codelineno-13-17" id="__codelineno-13-17" name="__codelineno-13-17"></a> <span class="k">def</span><span class="w"> </span><span class="nf">load_factor</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">float</span><span class="p">:</span>
<a href="#__codelineno-13-18" id="__codelineno-13-18" name="__codelineno-13-18"></a><span class="w"> </span><span class="sd">"""負荷率"""</span>
<a href="#__codelineno-13-19" id="__codelineno-13-19" name="__codelineno-13-19"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">/</span> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span>
<a href="#__codelineno-13-20" id="__codelineno-13-20" name="__codelineno-13-20"></a>
<a href="#__codelineno-13-21" id="__codelineno-13-21" name="__codelineno-13-21"></a> <span class="k">def</span><span class="w"> </span><span class="nf">find_bucket</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
<a href="#__codelineno-13-22" id="__codelineno-13-22" name="__codelineno-13-22"></a><span class="w"> </span><span class="sd">"""key に対応するバケットのインデックスを探索する"""</span>
<a href="#__codelineno-13-23" id="__codelineno-13-23" name="__codelineno-13-23"></a> <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-13-24" id="__codelineno-13-24" name="__codelineno-13-24"></a> <span class="n">first_tombstone</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
<a href="#__codelineno-13-25" id="__codelineno-13-25" name="__codelineno-13-25"></a> <span class="c1"># 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-13-26" id="__codelineno-13-26" name="__codelineno-13-26"></a> <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<a href="#__codelineno-13-27" id="__codelineno-13-27" name="__codelineno-13-27"></a> <span class="c1"># key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-13-28" id="__codelineno-13-28" name="__codelineno-13-28"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">key</span> <span class="o">==</span> <span class="n">key</span><span class="p">:</span>
<a href="#__codelineno-13-29" id="__codelineno-13-29" name="__codelineno-13-29"></a> <span class="c1"># それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-13-30" id="__codelineno-13-30" name="__codelineno-13-30"></a> <span class="k">if</span> <span class="n">first_tombstone</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
<a href="#__codelineno-13-31" id="__codelineno-13-31" name="__codelineno-13-31"></a> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">first_tombstone</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<a href="#__codelineno-13-32" id="__codelineno-13-32" name="__codelineno-13-32"></a> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TOMBSTONE</span>
<a href="#__codelineno-13-33" id="__codelineno-13-33" name="__codelineno-13-33"></a> <span class="k">return</span> <span class="n">first_tombstone</span> <span class="c1"># 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-13-34" id="__codelineno-13-34" name="__codelineno-13-34"></a> <span class="k">return</span> <span class="n">index</span> <span class="c1"># バケットのインデックスを返す</span>
<a href="#__codelineno-13-35" id="__codelineno-13-35" name="__codelineno-13-35"></a> <span class="c1"># 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-13-36" id="__codelineno-13-36" name="__codelineno-13-36"></a> <span class="k">if</span> <span class="n">first_tombstone</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">TOMBSTONE</span><span class="p">:</span>
<a href="#__codelineno-13-37" id="__codelineno-13-37" name="__codelineno-13-37"></a> <span class="n">first_tombstone</span> <span class="o">=</span> <span class="n">index</span>
<a href="#__codelineno-13-38" id="__codelineno-13-38" name="__codelineno-13-38"></a> <span class="c1"># バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-13-39" id="__codelineno-13-39" name="__codelineno-13-39"></a> <span class="n">index</span> <span class="o">=</span> <span class="p">(</span><span class="n">index</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span>
<a href="#__codelineno-13-40" id="__codelineno-13-40" name="__codelineno-13-40"></a> <span class="c1"># key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-13-41" id="__codelineno-13-41" name="__codelineno-13-41"></a> <span class="k">return</span> <span class="n">index</span> <span class="k">if</span> <span class="n">first_tombstone</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="k">else</span> <span class="n">first_tombstone</span>
<a href="#__codelineno-13-42" id="__codelineno-13-42" name="__codelineno-13-42"></a>
<a href="#__codelineno-13-43" id="__codelineno-13-43" name="__codelineno-13-43"></a> <span class="k">def</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<a href="#__codelineno-13-44" id="__codelineno-13-44" name="__codelineno-13-44"></a><span class="w"> </span><span class="sd">"""取得操作"""</span>
<a href="#__codelineno-13-45" id="__codelineno-13-45" name="__codelineno-13-45"></a> <span class="c1"># key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-13-46" id="__codelineno-13-46" name="__codelineno-13-46"></a> <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">find_bucket</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-13-47" id="__codelineno-13-47" name="__codelineno-13-47"></a> <span class="c1"># キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-13-48" id="__codelineno-13-48" name="__codelineno-13-48"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">TOMBSTONE</span><span class="p">]:</span>
<a href="#__codelineno-13-49" id="__codelineno-13-49" name="__codelineno-13-49"></a> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">val</span>
<a href="#__codelineno-13-50" id="__codelineno-13-50" name="__codelineno-13-50"></a> <span class="c1"># キーと値のペアが存在しない場合、None を返す</span>
<a href="#__codelineno-13-51" id="__codelineno-13-51" name="__codelineno-13-51"></a> <span class="k">return</span> <span class="kc">None</span>
<a href="#__codelineno-13-52" id="__codelineno-13-52" name="__codelineno-13-52"></a>
<a href="#__codelineno-13-53" id="__codelineno-13-53" name="__codelineno-13-53"></a> <span class="k">def</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<a href="#__codelineno-13-54" id="__codelineno-13-54" name="__codelineno-13-54"></a><span class="w"> </span><span class="sd">"""追加操作"""</span>
<a href="#__codelineno-13-55" id="__codelineno-13-55" name="__codelineno-13-55"></a> <span class="c1"># 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-13-56" id="__codelineno-13-56" name="__codelineno-13-56"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_factor</span><span class="p">()</span> <span class="o">&gt;</span> <span class="bp">self</span><span class="o">.</span><span class="n">load_thres</span><span class="p">:</span>
<a href="#__codelineno-13-57" id="__codelineno-13-57" name="__codelineno-13-57"></a> <span class="bp">self</span><span class="o">.</span><span class="n">extend</span><span class="p">()</span>
<a href="#__codelineno-13-58" id="__codelineno-13-58" name="__codelineno-13-58"></a> <span class="c1"># key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-13-59" id="__codelineno-13-59" name="__codelineno-13-59"></a> <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">find_bucket</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-13-60" id="__codelineno-13-60" name="__codelineno-13-60"></a> <span class="c1"># キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-13-61" id="__codelineno-13-61" name="__codelineno-13-61"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">TOMBSTONE</span><span class="p">]:</span>
<a href="#__codelineno-13-62" id="__codelineno-13-62" name="__codelineno-13-62"></a> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">.</span><span class="n">val</span> <span class="o">=</span> <span class="n">val</span>
<a href="#__codelineno-13-63" id="__codelineno-13-63" name="__codelineno-13-63"></a> <span class="k">return</span>
<a href="#__codelineno-13-64" id="__codelineno-13-64" name="__codelineno-13-64"></a> <span class="c1"># キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-13-65" id="__codelineno-13-65" name="__codelineno-13-65"></a> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-13-66" id="__codelineno-13-66" name="__codelineno-13-66"></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">+=</span> <span class="mi">1</span>
<a href="#__codelineno-13-67" id="__codelineno-13-67" name="__codelineno-13-67"></a>
<a href="#__codelineno-13-68" id="__codelineno-13-68" name="__codelineno-13-68"></a> <span class="k">def</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
<a href="#__codelineno-13-69" id="__codelineno-13-69" name="__codelineno-13-69"></a><span class="w"> </span><span class="sd">"""削除操作"""</span>
<a href="#__codelineno-13-70" id="__codelineno-13-70" name="__codelineno-13-70"></a> <span class="c1"># key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-13-71" id="__codelineno-13-71" name="__codelineno-13-71"></a> <span class="n">index</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">find_bucket</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-13-72" id="__codelineno-13-72" name="__codelineno-13-72"></a> <span class="c1"># キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-13-73" id="__codelineno-13-73" name="__codelineno-13-73"></a> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">TOMBSTONE</span><span class="p">]:</span>
<a href="#__codelineno-13-74" id="__codelineno-13-74" name="__codelineno-13-74"></a> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">TOMBSTONE</span>
<a href="#__codelineno-13-75" id="__codelineno-13-75" name="__codelineno-13-75"></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">-=</span> <span class="mi">1</span>
<a href="#__codelineno-13-76" id="__codelineno-13-76" name="__codelineno-13-76"></a>
<a href="#__codelineno-13-77" id="__codelineno-13-77" name="__codelineno-13-77"></a> <span class="k">def</span><span class="w"> </span><span class="nf">extend</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<a href="#__codelineno-13-78" id="__codelineno-13-78" name="__codelineno-13-78"></a><span class="w"> </span><span class="sd">"""ハッシュテーブルの容量を拡張する"""</span>
<a href="#__codelineno-13-79" id="__codelineno-13-79" name="__codelineno-13-79"></a> <span class="c1"># 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-13-80" id="__codelineno-13-80" name="__codelineno-13-80"></a> <span class="n">buckets_tmp</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span>
<a href="#__codelineno-13-81" id="__codelineno-13-81" name="__codelineno-13-81"></a> <span class="c1"># 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-13-82" id="__codelineno-13-82" name="__codelineno-13-82"></a> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span> <span class="o">*=</span> <span class="bp">self</span><span class="o">.</span><span class="n">extend_ratio</span>
<a href="#__codelineno-13-83" id="__codelineno-13-83" name="__codelineno-13-83"></a> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span> <span class="o">=</span> <span class="p">[</span><span class="kc">None</span><span class="p">]</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">capacity</span>
<a href="#__codelineno-13-84" id="__codelineno-13-84" name="__codelineno-13-84"></a> <span class="bp">self</span><span class="o">.</span><span class="n">size</span> <span class="o">=</span> <span class="mi">0</span>
<a href="#__codelineno-13-85" id="__codelineno-13-85" name="__codelineno-13-85"></a> <span class="c1"># キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-13-86" id="__codelineno-13-86" name="__codelineno-13-86"></a> <span class="k">for</span> <span class="n">pair</span> <span class="ow">in</span> <span class="n">buckets_tmp</span><span class="p">:</span>
<a href="#__codelineno-13-87" id="__codelineno-13-87" name="__codelineno-13-87"></a> <span class="k">if</span> <span class="n">pair</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">TOMBSTONE</span><span class="p">]:</span>
<a href="#__codelineno-13-88" id="__codelineno-13-88" name="__codelineno-13-88"></a> <span class="bp">self</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">pair</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-13-89" id="__codelineno-13-89" name="__codelineno-13-89"></a>
<a href="#__codelineno-13-90" id="__codelineno-13-90" name="__codelineno-13-90"></a> <span class="k">def</span><span class="w"> </span><span class="nf">print</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<a href="#__codelineno-13-91" id="__codelineno-13-91" name="__codelineno-13-91"></a><span class="w"> </span><span class="sd">"""ハッシュテーブルを表示する"""</span>
<a href="#__codelineno-13-92" id="__codelineno-13-92" name="__codelineno-13-92"></a> <span class="k">for</span> <span class="n">pair</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">buckets</span><span class="p">:</span>
<a href="#__codelineno-13-93" id="__codelineno-13-93" name="__codelineno-13-93"></a> <span class="k">if</span> <span class="n">pair</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<a href="#__codelineno-13-94" id="__codelineno-13-94" name="__codelineno-13-94"></a> <span class="nb">print</span><span class="p">(</span><span class="s2">"None"</span><span class="p">)</span>
<a href="#__codelineno-13-95" id="__codelineno-13-95" name="__codelineno-13-95"></a> <span class="k">elif</span> <span class="n">pair</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">TOMBSTONE</span><span class="p">:</span>
<a href="#__codelineno-13-96" id="__codelineno-13-96" name="__codelineno-13-96"></a> <span class="nb">print</span><span class="p">(</span><span class="s2">"TOMBSTONE"</span><span class="p">)</span>
<a href="#__codelineno-13-97" id="__codelineno-13-97" name="__codelineno-13-97"></a> <span class="k">else</span><span class="p">:</span>
<a href="#__codelineno-13-98" id="__codelineno-13-98" name="__codelineno-13-98"></a> <span class="nb">print</span><span class="p">(</span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="s2">"-&gt;"</span><span class="p">,</span> <span class="n">pair</span><span class="o">.</span><span class="n">val</span><span class="p">)</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.cpp</span><pre><span></span><code><a href="#__codelineno-14-1" id="__codelineno-14-1" name="__codelineno-14-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-14-2" id="__codelineno-14-2" name="__codelineno-14-2"></a><span class="k">class</span><span class="w"> </span><span class="nc">HashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-3" id="__codelineno-14-3" name="__codelineno-14-3"></a><span class="w"> </span><span class="k">private</span><span class="o">:</span>
<a href="#__codelineno-14-4" id="__codelineno-14-4" name="__codelineno-14-4"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-14-5" id="__codelineno-14-5" name="__codelineno-14-5"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-14-6" id="__codelineno-14-6" name="__codelineno-14-6"></a><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-14-7" id="__codelineno-14-7" name="__codelineno-14-7"></a><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-14-8" id="__codelineno-14-8" name="__codelineno-14-8"></a><span class="w"> </span><span class="n">vector</span><span class="o">&lt;</span><span class="n">Pair</span><span class="w"> </span><span class="o">*&gt;</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-14-9" id="__codelineno-14-9" name="__codelineno-14-9"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="mi">-1</span><span class="p">,</span><span class="w"> </span><span class="s">"-1"</span><span class="p">);</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-14-10" id="__codelineno-14-10" name="__codelineno-14-10"></a>
<a href="#__codelineno-14-11" id="__codelineno-14-11" name="__codelineno-14-11"></a><span class="w"> </span><span class="k">public</span><span class="o">:</span>
<a href="#__codelineno-14-12" id="__codelineno-14-12" name="__codelineno-14-12"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-14-13" id="__codelineno-14-13" name="__codelineno-14-13"></a><span class="w"> </span><span class="n">HashMapOpenAddressing</span><span class="p">()</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">size</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span><span class="w"> </span><span class="n">buckets</span><span class="p">(</span><span class="n">capacity</span><span class="p">,</span><span class="w"> </span><span class="nb">nullptr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-14" id="__codelineno-14-14" name="__codelineno-14-14"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-15" id="__codelineno-14-15" name="__codelineno-14-15"></a>
<a href="#__codelineno-14-16" id="__codelineno-14-16" name="__codelineno-14-16"></a><span class="w"> </span><span class="cm">/* デストラクタ */</span>
<a href="#__codelineno-14-17" id="__codelineno-14-17" name="__codelineno-14-17"></a><span class="w"> </span><span class="o">~</span><span class="n">HashMapOpenAddressing</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-18" id="__codelineno-14-18" name="__codelineno-14-18"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-19" id="__codelineno-14-19" name="__codelineno-14-19"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">nullptr</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-20" id="__codelineno-14-20" name="__codelineno-14-20"></a><span class="w"> </span><span class="k">delete</span><span class="w"> </span><span class="n">pair</span><span class="p">;</span>
<a href="#__codelineno-14-21" id="__codelineno-14-21" name="__codelineno-14-21"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-22" id="__codelineno-14-22" name="__codelineno-14-22"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-23" id="__codelineno-14-23" name="__codelineno-14-23"></a><span class="w"> </span><span class="k">delete</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-14-24" id="__codelineno-14-24" name="__codelineno-14-24"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-25" id="__codelineno-14-25" name="__codelineno-14-25"></a>
<a href="#__codelineno-14-26" id="__codelineno-14-26" name="__codelineno-14-26"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-14-27" id="__codelineno-14-27" name="__codelineno-14-27"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-28" id="__codelineno-14-28" name="__codelineno-14-28"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-14-29" id="__codelineno-14-29" name="__codelineno-14-29"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-30" id="__codelineno-14-30" name="__codelineno-14-30"></a>
<a href="#__codelineno-14-31" id="__codelineno-14-31" name="__codelineno-14-31"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-14-32" id="__codelineno-14-32" name="__codelineno-14-32"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-33" id="__codelineno-14-33" name="__codelineno-14-33"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-14-34" id="__codelineno-14-34" name="__codelineno-14-34"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-35" id="__codelineno-14-35" name="__codelineno-14-35"></a>
<a href="#__codelineno-14-36" id="__codelineno-14-36" name="__codelineno-14-36"></a><span class="w"> </span><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-14-37" id="__codelineno-14-37" name="__codelineno-14-37"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-38" id="__codelineno-14-38" name="__codelineno-14-38"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-14-39" id="__codelineno-14-39" name="__codelineno-14-39"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<a href="#__codelineno-14-40" id="__codelineno-14-40" name="__codelineno-14-40"></a><span class="w"> </span><span class="c1">// 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-14-41" id="__codelineno-14-41" name="__codelineno-14-41"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">nullptr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-42" id="__codelineno-14-42" name="__codelineno-14-42"></a><span class="w"> </span><span class="c1">// key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-14-43" id="__codelineno-14-43" name="__codelineno-14-43"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-44" id="__codelineno-14-44" name="__codelineno-14-44"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-14-45" id="__codelineno-14-45" name="__codelineno-14-45"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">-1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-46" id="__codelineno-14-46" name="__codelineno-14-46"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">firstTombstone</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-14-47" id="__codelineno-14-47" name="__codelineno-14-47"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-14-48" id="__codelineno-14-48" name="__codelineno-14-48"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="p">;</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-14-49" id="__codelineno-14-49" name="__codelineno-14-49"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-50" id="__codelineno-14-50" name="__codelineno-14-50"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケットのインデックスを返す</span>
<a href="#__codelineno-14-51" id="__codelineno-14-51" name="__codelineno-14-51"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-52" id="__codelineno-14-52" name="__codelineno-14-52"></a><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-14-53" id="__codelineno-14-53" name="__codelineno-14-53"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">-1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-54" id="__codelineno-14-54" name="__codelineno-14-54"></a><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">;</span>
<a href="#__codelineno-14-55" id="__codelineno-14-55" name="__codelineno-14-55"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-56" id="__codelineno-14-56" name="__codelineno-14-56"></a><span class="w"> </span><span class="c1">// バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-14-57" id="__codelineno-14-57" name="__codelineno-14-57"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-14-58" id="__codelineno-14-58" name="__codelineno-14-58"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-59" id="__codelineno-14-59" name="__codelineno-14-59"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-14-60" id="__codelineno-14-60" name="__codelineno-14-60"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">-1</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">firstTombstone</span><span class="p">;</span>
<a href="#__codelineno-14-61" id="__codelineno-14-61" name="__codelineno-14-61"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-62" id="__codelineno-14-62" name="__codelineno-14-62"></a>
<a href="#__codelineno-14-63" id="__codelineno-14-63" name="__codelineno-14-63"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-14-64" id="__codelineno-14-64" name="__codelineno-14-64"></a><span class="w"> </span><span class="n">string</span><span class="w"> </span><span class="n">get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-65" id="__codelineno-14-65" name="__codelineno-14-65"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-14-66" id="__codelineno-14-66" name="__codelineno-14-66"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-14-67" id="__codelineno-14-67" name="__codelineno-14-67"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-14-68" id="__codelineno-14-68" name="__codelineno-14-68"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">nullptr</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-69" id="__codelineno-14-69" name="__codelineno-14-69"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-14-70" id="__codelineno-14-70" name="__codelineno-14-70"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-71" id="__codelineno-14-71" name="__codelineno-14-71"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、空文字列を返す</span>
<a href="#__codelineno-14-72" id="__codelineno-14-72" name="__codelineno-14-72"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s">""</span><span class="p">;</span>
<a href="#__codelineno-14-73" id="__codelineno-14-73" name="__codelineno-14-73"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-74" id="__codelineno-14-74" name="__codelineno-14-74"></a>
<a href="#__codelineno-14-75" id="__codelineno-14-75" name="__codelineno-14-75"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-14-76" id="__codelineno-14-76" name="__codelineno-14-76"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">string</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-77" id="__codelineno-14-77" name="__codelineno-14-77"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-14-78" id="__codelineno-14-78" name="__codelineno-14-78"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-79" id="__codelineno-14-79" name="__codelineno-14-79"></a><span class="w"> </span><span class="n">extend</span><span class="p">();</span>
<a href="#__codelineno-14-80" id="__codelineno-14-80" name="__codelineno-14-80"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-81" id="__codelineno-14-81" name="__codelineno-14-81"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-14-82" id="__codelineno-14-82" name="__codelineno-14-82"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-14-83" id="__codelineno-14-83" name="__codelineno-14-83"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-14-84" id="__codelineno-14-84" name="__codelineno-14-84"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">nullptr</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-85" id="__codelineno-14-85" name="__codelineno-14-85"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-14-86" id="__codelineno-14-86" name="__codelineno-14-86"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-14-87" id="__codelineno-14-87" name="__codelineno-14-87"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-88" id="__codelineno-14-88" name="__codelineno-14-88"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-14-89" id="__codelineno-14-89" name="__codelineno-14-89"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-14-90" id="__codelineno-14-90" name="__codelineno-14-90"></a><span class="w"> </span><span class="n">size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-14-91" id="__codelineno-14-91" name="__codelineno-14-91"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-92" id="__codelineno-14-92" name="__codelineno-14-92"></a>
<a href="#__codelineno-14-93" id="__codelineno-14-93" name="__codelineno-14-93"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-14-94" id="__codelineno-14-94" name="__codelineno-14-94"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">remove</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-95" id="__codelineno-14-95" name="__codelineno-14-95"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-14-96" id="__codelineno-14-96" name="__codelineno-14-96"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-14-97" id="__codelineno-14-97" name="__codelineno-14-97"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-14-98" id="__codelineno-14-98" name="__codelineno-14-98"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">nullptr</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-99" id="__codelineno-14-99" name="__codelineno-14-99"></a><span class="w"> </span><span class="k">delete</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-14-100" id="__codelineno-14-100" name="__codelineno-14-100"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-14-101" id="__codelineno-14-101" name="__codelineno-14-101"></a><span class="w"> </span><span class="n">size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-14-102" id="__codelineno-14-102" name="__codelineno-14-102"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-103" id="__codelineno-14-103" name="__codelineno-14-103"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-104" id="__codelineno-14-104" name="__codelineno-14-104"></a>
<a href="#__codelineno-14-105" id="__codelineno-14-105" name="__codelineno-14-105"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-14-106" id="__codelineno-14-106" name="__codelineno-14-106"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-107" id="__codelineno-14-107" name="__codelineno-14-107"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-14-108" id="__codelineno-14-108" name="__codelineno-14-108"></a><span class="w"> </span><span class="n">vector</span><span class="o">&lt;</span><span class="n">Pair</span><span class="w"> </span><span class="o">*&gt;</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span>
<a href="#__codelineno-14-109" id="__codelineno-14-109" name="__codelineno-14-109"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-14-110" id="__codelineno-14-110" name="__codelineno-14-110"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span>
<a href="#__codelineno-14-111" id="__codelineno-14-111" name="__codelineno-14-111"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">vector</span><span class="o">&lt;</span><span class="n">Pair</span><span class="w"> </span><span class="o">*&gt;</span><span class="p">(</span><span class="n">capacity</span><span class="p">,</span><span class="w"> </span><span class="nb">nullptr</span><span class="p">);</span>
<a href="#__codelineno-14-112" id="__codelineno-14-112" name="__codelineno-14-112"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-14-113" id="__codelineno-14-113" name="__codelineno-14-113"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-14-114" id="__codelineno-14-114" name="__codelineno-14-114"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-115" id="__codelineno-14-115" name="__codelineno-14-115"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">nullptr</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-116" id="__codelineno-14-116" name="__codelineno-14-116"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-14-117" id="__codelineno-14-117" name="__codelineno-14-117"></a><span class="w"> </span><span class="k">delete</span><span class="w"> </span><span class="n">pair</span><span class="p">;</span>
<a href="#__codelineno-14-118" id="__codelineno-14-118" name="__codelineno-14-118"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-119" id="__codelineno-14-119" name="__codelineno-14-119"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-120" id="__codelineno-14-120" name="__codelineno-14-120"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-121" id="__codelineno-14-121" name="__codelineno-14-121"></a>
<a href="#__codelineno-14-122" id="__codelineno-14-122" name="__codelineno-14-122"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-14-123" id="__codelineno-14-123" name="__codelineno-14-123"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-124" id="__codelineno-14-124" name="__codelineno-14-124"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-125" id="__codelineno-14-125" name="__codelineno-14-125"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nb">nullptr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-126" id="__codelineno-14-126" name="__codelineno-14-126"></a><span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">"nullptr"</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span>
<a href="#__codelineno-14-127" id="__codelineno-14-127" name="__codelineno-14-127"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-128" id="__codelineno-14-128" name="__codelineno-14-128"></a><span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">"TOMBSTONE"</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span>
<a href="#__codelineno-14-129" id="__codelineno-14-129" name="__codelineno-14-129"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-14-130" id="__codelineno-14-130" name="__codelineno-14-130"></a><span class="w"> </span><span class="n">cout</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="s">" -&gt; "</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="w"> </span><span class="o">&lt;&lt;</span><span class="w"> </span><span class="n">endl</span><span class="p">;</span>
<a href="#__codelineno-14-131" id="__codelineno-14-131" name="__codelineno-14-131"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-132" id="__codelineno-14-132" name="__codelineno-14-132"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-133" id="__codelineno-14-133" name="__codelineno-14-133"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-14-134" id="__codelineno-14-134" name="__codelineno-14-134"></a><span class="p">};</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.java</span><pre><span></span><code><a href="#__codelineno-15-1" id="__codelineno-15-1" name="__codelineno-15-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-15-2" id="__codelineno-15-2" name="__codelineno-15-2"></a><span class="kd">class</span> <span class="nc">HashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-3" id="__codelineno-15-3" name="__codelineno-15-3"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-15-4" id="__codelineno-15-4" name="__codelineno-15-4"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-15-5" id="__codelineno-15-5" name="__codelineno-15-5"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-15-6" id="__codelineno-15-6" name="__codelineno-15-6"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-15-7" id="__codelineno-15-7" name="__codelineno-15-7"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="n">Pair</span><span class="o">[]</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-15-8" id="__codelineno-15-8" name="__codelineno-15-8"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s">"-1"</span><span class="p">);</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-15-9" id="__codelineno-15-9" name="__codelineno-15-9"></a>
<a href="#__codelineno-15-10" id="__codelineno-15-10" name="__codelineno-15-10"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-15-11" id="__codelineno-15-11" name="__codelineno-15-11"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="nf">HashMapOpenAddressing</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-12" id="__codelineno-15-12" name="__codelineno-15-12"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-15-13" id="__codelineno-15-13" name="__codelineno-15-13"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="o">[</span><span class="n">capacity</span><span class="o">]</span><span class="p">;</span>
<a href="#__codelineno-15-14" id="__codelineno-15-14" name="__codelineno-15-14"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-15" id="__codelineno-15-15" name="__codelineno-15-15"></a>
<a href="#__codelineno-15-16" id="__codelineno-15-16" name="__codelineno-15-16"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-15-17" id="__codelineno-15-17" name="__codelineno-15-17"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">hashFunc</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-18" id="__codelineno-15-18" name="__codelineno-15-18"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-15-19" id="__codelineno-15-19" name="__codelineno-15-19"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-20" id="__codelineno-15-20" name="__codelineno-15-20"></a>
<a href="#__codelineno-15-21" id="__codelineno-15-21" name="__codelineno-15-21"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-15-22" id="__codelineno-15-22" name="__codelineno-15-22"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="nf">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-23" id="__codelineno-15-23" name="__codelineno-15-23"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-15-24" id="__codelineno-15-24" name="__codelineno-15-24"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-25" id="__codelineno-15-25" name="__codelineno-15-25"></a>
<a href="#__codelineno-15-26" id="__codelineno-15-26" name="__codelineno-15-26"></a><span class="w"> </span><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-15-27" id="__codelineno-15-27" name="__codelineno-15-27"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">findBucket</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-28" id="__codelineno-15-28" name="__codelineno-15-28"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-15-29" id="__codelineno-15-29" name="__codelineno-15-29"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<a href="#__codelineno-15-30" id="__codelineno-15-30" name="__codelineno-15-30"></a><span class="w"> </span><span class="c1">// 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-15-31" id="__codelineno-15-31" name="__codelineno-15-31"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-32" id="__codelineno-15-32" name="__codelineno-15-32"></a><span class="w"> </span><span class="c1">// key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-15-33" id="__codelineno-15-33" name="__codelineno-15-33"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="p">.</span><span class="na">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-34" id="__codelineno-15-34" name="__codelineno-15-34"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-15-35" id="__codelineno-15-35" name="__codelineno-15-35"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-36" id="__codelineno-15-36" name="__codelineno-15-36"></a><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">firstTombstone</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="p">;</span>
<a href="#__codelineno-15-37" id="__codelineno-15-37" name="__codelineno-15-37"></a><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-15-38" id="__codelineno-15-38" name="__codelineno-15-38"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="p">;</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-15-39" id="__codelineno-15-39" name="__codelineno-15-39"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-40" id="__codelineno-15-40" name="__codelineno-15-40"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケットのインデックスを返す</span>
<a href="#__codelineno-15-41" id="__codelineno-15-41" name="__codelineno-15-41"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-42" id="__codelineno-15-42" name="__codelineno-15-42"></a><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-15-43" id="__codelineno-15-43" name="__codelineno-15-43"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-44" id="__codelineno-15-44" name="__codelineno-15-44"></a><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">;</span>
<a href="#__codelineno-15-45" id="__codelineno-15-45" name="__codelineno-15-45"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-46" id="__codelineno-15-46" name="__codelineno-15-46"></a><span class="w"> </span><span class="c1">// バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-15-47" id="__codelineno-15-47" name="__codelineno-15-47"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-15-48" id="__codelineno-15-48" name="__codelineno-15-48"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-49" id="__codelineno-15-49" name="__codelineno-15-49"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-15-50" id="__codelineno-15-50" name="__codelineno-15-50"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">firstTombstone</span><span class="p">;</span>
<a href="#__codelineno-15-51" id="__codelineno-15-51" name="__codelineno-15-51"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-52" id="__codelineno-15-52" name="__codelineno-15-52"></a>
<a href="#__codelineno-15-53" id="__codelineno-15-53" name="__codelineno-15-53"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-15-54" id="__codelineno-15-54" name="__codelineno-15-54"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-55" id="__codelineno-15-55" name="__codelineno-15-55"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-15-56" id="__codelineno-15-56" name="__codelineno-15-56"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-15-57" id="__codelineno-15-57" name="__codelineno-15-57"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-15-58" id="__codelineno-15-58" name="__codelineno-15-58"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-59" id="__codelineno-15-59" name="__codelineno-15-59"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="p">.</span><span class="na">val</span><span class="p">;</span>
<a href="#__codelineno-15-60" id="__codelineno-15-60" name="__codelineno-15-60"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-61" id="__codelineno-15-61" name="__codelineno-15-61"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、null を返す</span>
<a href="#__codelineno-15-62" id="__codelineno-15-62" name="__codelineno-15-62"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<a href="#__codelineno-15-63" id="__codelineno-15-63" name="__codelineno-15-63"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-64" id="__codelineno-15-64" name="__codelineno-15-64"></a>
<a href="#__codelineno-15-65" id="__codelineno-15-65" name="__codelineno-15-65"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-15-66" id="__codelineno-15-66" name="__codelineno-15-66"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-67" id="__codelineno-15-67" name="__codelineno-15-67"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-15-68" id="__codelineno-15-68" name="__codelineno-15-68"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-69" id="__codelineno-15-69" name="__codelineno-15-69"></a><span class="w"> </span><span class="n">extend</span><span class="p">();</span>
<a href="#__codelineno-15-70" id="__codelineno-15-70" name="__codelineno-15-70"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-71" id="__codelineno-15-71" name="__codelineno-15-71"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-15-72" id="__codelineno-15-72" name="__codelineno-15-72"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-15-73" id="__codelineno-15-73" name="__codelineno-15-73"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-15-74" id="__codelineno-15-74" name="__codelineno-15-74"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-75" id="__codelineno-15-75" name="__codelineno-15-75"></a><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="p">.</span><span class="na">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-15-76" id="__codelineno-15-76" name="__codelineno-15-76"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-15-77" id="__codelineno-15-77" name="__codelineno-15-77"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-78" id="__codelineno-15-78" name="__codelineno-15-78"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-15-79" id="__codelineno-15-79" name="__codelineno-15-79"></a><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-15-80" id="__codelineno-15-80" name="__codelineno-15-80"></a><span class="w"> </span><span class="n">size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-15-81" id="__codelineno-15-81" name="__codelineno-15-81"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-82" id="__codelineno-15-82" name="__codelineno-15-82"></a>
<a href="#__codelineno-15-83" id="__codelineno-15-83" name="__codelineno-15-83"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-15-84" id="__codelineno-15-84" name="__codelineno-15-84"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-85" id="__codelineno-15-85" name="__codelineno-15-85"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-15-86" id="__codelineno-15-86" name="__codelineno-15-86"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-15-87" id="__codelineno-15-87" name="__codelineno-15-87"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-15-88" id="__codelineno-15-88" name="__codelineno-15-88"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-89" id="__codelineno-15-89" name="__codelineno-15-89"></a><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-15-90" id="__codelineno-15-90" name="__codelineno-15-90"></a><span class="w"> </span><span class="n">size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-15-91" id="__codelineno-15-91" name="__codelineno-15-91"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-92" id="__codelineno-15-92" name="__codelineno-15-92"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-93" id="__codelineno-15-93" name="__codelineno-15-93"></a>
<a href="#__codelineno-15-94" id="__codelineno-15-94" name="__codelineno-15-94"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-15-95" id="__codelineno-15-95" name="__codelineno-15-95"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-96" id="__codelineno-15-96" name="__codelineno-15-96"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-15-97" id="__codelineno-15-97" name="__codelineno-15-97"></a><span class="w"> </span><span class="n">Pair</span><span class="o">[]</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span>
<a href="#__codelineno-15-98" id="__codelineno-15-98" name="__codelineno-15-98"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-15-99" id="__codelineno-15-99" name="__codelineno-15-99"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span>
<a href="#__codelineno-15-100" id="__codelineno-15-100" name="__codelineno-15-100"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="o">[</span><span class="n">capacity</span><span class="o">]</span><span class="p">;</span>
<a href="#__codelineno-15-101" id="__codelineno-15-101" name="__codelineno-15-101"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-15-102" id="__codelineno-15-102" name="__codelineno-15-102"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-15-103" id="__codelineno-15-103" name="__codelineno-15-103"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-104" id="__codelineno-15-104" name="__codelineno-15-104"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-105" id="__codelineno-15-105" name="__codelineno-15-105"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">val</span><span class="p">);</span>
<a href="#__codelineno-15-106" id="__codelineno-15-106" name="__codelineno-15-106"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-107" id="__codelineno-15-107" name="__codelineno-15-107"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-108" id="__codelineno-15-108" name="__codelineno-15-108"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-109" id="__codelineno-15-109" name="__codelineno-15-109"></a>
<a href="#__codelineno-15-110" id="__codelineno-15-110" name="__codelineno-15-110"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-15-111" id="__codelineno-15-111" name="__codelineno-15-111"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-112" id="__codelineno-15-112" name="__codelineno-15-112"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-113" id="__codelineno-15-113" name="__codelineno-15-113"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-114" id="__codelineno-15-114" name="__codelineno-15-114"></a><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">"null"</span><span class="p">);</span>
<a href="#__codelineno-15-115" id="__codelineno-15-115" name="__codelineno-15-115"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-116" id="__codelineno-15-116" name="__codelineno-15-116"></a><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">"TOMBSTONE"</span><span class="p">);</span>
<a href="#__codelineno-15-117" id="__codelineno-15-117" name="__codelineno-15-117"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-15-118" id="__codelineno-15-118" name="__codelineno-15-118"></a><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" -&gt; "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">val</span><span class="p">);</span>
<a href="#__codelineno-15-119" id="__codelineno-15-119" name="__codelineno-15-119"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-120" id="__codelineno-15-120" name="__codelineno-15-120"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-121" id="__codelineno-15-121" name="__codelineno-15-121"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-15-122" id="__codelineno-15-122" name="__codelineno-15-122"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.cs</span><pre><span></span><code><a href="#__codelineno-16-1" id="__codelineno-16-1" name="__codelineno-16-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-16-2" id="__codelineno-16-2" name="__codelineno-16-2"></a><span class="k">class</span><span class="w"> </span><span class="nc">HashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-3" id="__codelineno-16-3" name="__codelineno-16-3"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-16-4" id="__codelineno-16-4" name="__codelineno-16-4"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-16-5" id="__codelineno-16-5" name="__codelineno-16-5"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-16-6" id="__codelineno-16-6" name="__codelineno-16-6"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-16-7" id="__codelineno-16-7" name="__codelineno-16-7"></a><span class="w"> </span><span class="n">Pair</span><span class="p">[]</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-16-8" id="__codelineno-16-8" name="__codelineno-16-8"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s">"-1"</span><span class="p">);</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-16-9" id="__codelineno-16-9" name="__codelineno-16-9"></a>
<a href="#__codelineno-16-10" id="__codelineno-16-10" name="__codelineno-16-10"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-16-11" id="__codelineno-16-11" name="__codelineno-16-11"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="nf">HashMapOpenAddressing</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-12" id="__codelineno-16-12" name="__codelineno-16-12"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-16-13" id="__codelineno-16-13" name="__codelineno-16-13"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">[</span><span class="n">capacity</span><span class="p">];</span>
<a href="#__codelineno-16-14" id="__codelineno-16-14" name="__codelineno-16-14"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-15" id="__codelineno-16-15" name="__codelineno-16-15"></a>
<a href="#__codelineno-16-16" id="__codelineno-16-16" name="__codelineno-16-16"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-16-17" id="__codelineno-16-17" name="__codelineno-16-17"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">HashFunc</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-18" id="__codelineno-16-18" name="__codelineno-16-18"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-16-19" id="__codelineno-16-19" name="__codelineno-16-19"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-20" id="__codelineno-16-20" name="__codelineno-16-20"></a>
<a href="#__codelineno-16-21" id="__codelineno-16-21" name="__codelineno-16-21"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-16-22" id="__codelineno-16-22" name="__codelineno-16-22"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="nf">LoadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-23" id="__codelineno-16-23" name="__codelineno-16-23"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-16-24" id="__codelineno-16-24" name="__codelineno-16-24"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-25" id="__codelineno-16-25" name="__codelineno-16-25"></a>
<a href="#__codelineno-16-26" id="__codelineno-16-26" name="__codelineno-16-26"></a><span class="w"> </span><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-16-27" id="__codelineno-16-27" name="__codelineno-16-27"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">FindBucket</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-28" id="__codelineno-16-28" name="__codelineno-16-28"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-16-29" id="__codelineno-16-29" name="__codelineno-16-29"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<a href="#__codelineno-16-30" id="__codelineno-16-30" name="__codelineno-16-30"></a><span class="w"> </span><span class="c1">// 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-16-31" id="__codelineno-16-31" name="__codelineno-16-31"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-32" id="__codelineno-16-32" name="__codelineno-16-32"></a><span class="w"> </span><span class="c1">// key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-16-33" id="__codelineno-16-33" name="__codelineno-16-33"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-34" id="__codelineno-16-34" name="__codelineno-16-34"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-16-35" id="__codelineno-16-35" name="__codelineno-16-35"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-36" id="__codelineno-16-36" name="__codelineno-16-36"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">firstTombstone</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-16-37" id="__codelineno-16-37" name="__codelineno-16-37"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-16-38" id="__codelineno-16-38" name="__codelineno-16-38"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="p">;</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-16-39" id="__codelineno-16-39" name="__codelineno-16-39"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-40" id="__codelineno-16-40" name="__codelineno-16-40"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケットのインデックスを返す</span>
<a href="#__codelineno-16-41" id="__codelineno-16-41" name="__codelineno-16-41"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-42" id="__codelineno-16-42" name="__codelineno-16-42"></a><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-16-43" id="__codelineno-16-43" name="__codelineno-16-43"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-44" id="__codelineno-16-44" name="__codelineno-16-44"></a><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">;</span>
<a href="#__codelineno-16-45" id="__codelineno-16-45" name="__codelineno-16-45"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-46" id="__codelineno-16-46" name="__codelineno-16-46"></a><span class="w"> </span><span class="c1">// バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-16-47" id="__codelineno-16-47" name="__codelineno-16-47"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-16-48" id="__codelineno-16-48" name="__codelineno-16-48"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-49" id="__codelineno-16-49" name="__codelineno-16-49"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-16-50" id="__codelineno-16-50" name="__codelineno-16-50"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">firstTombstone</span><span class="p">;</span>
<a href="#__codelineno-16-51" id="__codelineno-16-51" name="__codelineno-16-51"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-52" id="__codelineno-16-52" name="__codelineno-16-52"></a>
<a href="#__codelineno-16-53" id="__codelineno-16-53" name="__codelineno-16-53"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-16-54" id="__codelineno-16-54" name="__codelineno-16-54"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="kt">string?</span><span class="w"> </span><span class="n">Get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-55" id="__codelineno-16-55" name="__codelineno-16-55"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-16-56" id="__codelineno-16-56" name="__codelineno-16-56"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">FindBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-16-57" id="__codelineno-16-57" name="__codelineno-16-57"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-16-58" id="__codelineno-16-58" name="__codelineno-16-58"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-59" id="__codelineno-16-59" name="__codelineno-16-59"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-16-60" id="__codelineno-16-60" name="__codelineno-16-60"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-61" id="__codelineno-16-61" name="__codelineno-16-61"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、null を返す</span>
<a href="#__codelineno-16-62" id="__codelineno-16-62" name="__codelineno-16-62"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">null</span><span class="p">;</span>
<a href="#__codelineno-16-63" id="__codelineno-16-63" name="__codelineno-16-63"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-64" id="__codelineno-16-64" name="__codelineno-16-64"></a>
<a href="#__codelineno-16-65" id="__codelineno-16-65" name="__codelineno-16-65"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-16-66" id="__codelineno-16-66" name="__codelineno-16-66"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Put</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-67" id="__codelineno-16-67" name="__codelineno-16-67"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-16-68" id="__codelineno-16-68" name="__codelineno-16-68"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">LoadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-69" id="__codelineno-16-69" name="__codelineno-16-69"></a><span class="w"> </span><span class="n">Extend</span><span class="p">();</span>
<a href="#__codelineno-16-70" id="__codelineno-16-70" name="__codelineno-16-70"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-71" id="__codelineno-16-71" name="__codelineno-16-71"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-16-72" id="__codelineno-16-72" name="__codelineno-16-72"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">FindBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-16-73" id="__codelineno-16-73" name="__codelineno-16-73"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-16-74" id="__codelineno-16-74" name="__codelineno-16-74"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-75" id="__codelineno-16-75" name="__codelineno-16-75"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-16-76" id="__codelineno-16-76" name="__codelineno-16-76"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-16-77" id="__codelineno-16-77" name="__codelineno-16-77"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-78" id="__codelineno-16-78" name="__codelineno-16-78"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-16-79" id="__codelineno-16-79" name="__codelineno-16-79"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-16-80" id="__codelineno-16-80" name="__codelineno-16-80"></a><span class="w"> </span><span class="n">size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-16-81" id="__codelineno-16-81" name="__codelineno-16-81"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-82" id="__codelineno-16-82" name="__codelineno-16-82"></a>
<a href="#__codelineno-16-83" id="__codelineno-16-83" name="__codelineno-16-83"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-16-84" id="__codelineno-16-84" name="__codelineno-16-84"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Remove</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-85" id="__codelineno-16-85" name="__codelineno-16-85"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-16-86" id="__codelineno-16-86" name="__codelineno-16-86"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">FindBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-16-87" id="__codelineno-16-87" name="__codelineno-16-87"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-16-88" id="__codelineno-16-88" name="__codelineno-16-88"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-89" id="__codelineno-16-89" name="__codelineno-16-89"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-16-90" id="__codelineno-16-90" name="__codelineno-16-90"></a><span class="w"> </span><span class="n">size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-16-91" id="__codelineno-16-91" name="__codelineno-16-91"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-92" id="__codelineno-16-92" name="__codelineno-16-92"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-93" id="__codelineno-16-93" name="__codelineno-16-93"></a>
<a href="#__codelineno-16-94" id="__codelineno-16-94" name="__codelineno-16-94"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-16-95" id="__codelineno-16-95" name="__codelineno-16-95"></a><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-96" id="__codelineno-16-96" name="__codelineno-16-96"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-16-97" id="__codelineno-16-97" name="__codelineno-16-97"></a><span class="w"> </span><span class="n">Pair</span><span class="p">[]</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">;</span>
<a href="#__codelineno-16-98" id="__codelineno-16-98" name="__codelineno-16-98"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-16-99" id="__codelineno-16-99" name="__codelineno-16-99"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span>
<a href="#__codelineno-16-100" id="__codelineno-16-100" name="__codelineno-16-100"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">[</span><span class="n">capacity</span><span class="p">];</span>
<a href="#__codelineno-16-101" id="__codelineno-16-101" name="__codelineno-16-101"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-16-102" id="__codelineno-16-102" name="__codelineno-16-102"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-16-103" id="__codelineno-16-103" name="__codelineno-16-103"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-104" id="__codelineno-16-104" name="__codelineno-16-104"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-105" id="__codelineno-16-105" name="__codelineno-16-105"></a><span class="w"> </span><span class="n">Put</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-16-106" id="__codelineno-16-106" name="__codelineno-16-106"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-107" id="__codelineno-16-107" name="__codelineno-16-107"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-108" id="__codelineno-16-108" name="__codelineno-16-108"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-109" id="__codelineno-16-109" name="__codelineno-16-109"></a>
<a href="#__codelineno-16-110" id="__codelineno-16-110" name="__codelineno-16-110"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-16-111" id="__codelineno-16-111" name="__codelineno-16-111"></a><span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-112" id="__codelineno-16-112" name="__codelineno-16-112"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-113" id="__codelineno-16-113" name="__codelineno-16-113"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-114" id="__codelineno-16-114" name="__codelineno-16-114"></a><span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">"null"</span><span class="p">);</span>
<a href="#__codelineno-16-115" id="__codelineno-16-115" name="__codelineno-16-115"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-116" id="__codelineno-16-116" name="__codelineno-16-116"></a><span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">"TOMBSTONE"</span><span class="p">);</span>
<a href="#__codelineno-16-117" id="__codelineno-16-117" name="__codelineno-16-117"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-16-118" id="__codelineno-16-118" name="__codelineno-16-118"></a><span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" -&gt; "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-16-119" id="__codelineno-16-119" name="__codelineno-16-119"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-120" id="__codelineno-16-120" name="__codelineno-16-120"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-121" id="__codelineno-16-121" name="__codelineno-16-121"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-16-122" id="__codelineno-16-122" name="__codelineno-16-122"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.go</span><pre><span></span><code><a href="#__codelineno-17-1" id="__codelineno-17-1" name="__codelineno-17-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-17-2" id="__codelineno-17-2" name="__codelineno-17-2"></a><span class="kd">type</span><span class="w"> </span><span class="nx">hashMapOpenAddressing</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-3" id="__codelineno-17-3" name="__codelineno-17-3"></a><span class="w"> </span><span class="nx">size</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-17-4" id="__codelineno-17-4" name="__codelineno-17-4"></a><span class="w"> </span><span class="nx">capacity</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-17-5" id="__codelineno-17-5" name="__codelineno-17-5"></a><span class="w"> </span><span class="nx">loadThres</span><span class="w"> </span><span class="kt">float64</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-17-6" id="__codelineno-17-6" name="__codelineno-17-6"></a><span class="w"> </span><span class="nx">extendRatio</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-17-7" id="__codelineno-17-7" name="__codelineno-17-7"></a><span class="w"> </span><span class="nx">buckets</span><span class="w"> </span><span class="p">[]</span><span class="o">*</span><span class="nx">pair</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-17-8" id="__codelineno-17-8" name="__codelineno-17-8"></a><span class="w"> </span><span class="nx">TOMBSTONE</span><span class="w"> </span><span class="o">*</span><span class="nx">pair</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-17-9" id="__codelineno-17-9" name="__codelineno-17-9"></a><span class="p">}</span>
<a href="#__codelineno-17-10" id="__codelineno-17-10" name="__codelineno-17-10"></a>
<a href="#__codelineno-17-11" id="__codelineno-17-11" name="__codelineno-17-11"></a><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-17-12" id="__codelineno-17-12" name="__codelineno-17-12"></a><span class="kd">func</span><span class="w"> </span><span class="nx">newHashMapOpenAddressing</span><span class="p">()</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-13" id="__codelineno-17-13" name="__codelineno-17-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">hashMapOpenAddressing</span><span class="p">{</span>
<a href="#__codelineno-17-14" id="__codelineno-17-14" name="__codelineno-17-14"></a><span class="w"> </span><span class="nx">size</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<a href="#__codelineno-17-15" id="__codelineno-17-15" name="__codelineno-17-15"></a><span class="w"> </span><span class="nx">capacity</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span>
<a href="#__codelineno-17-16" id="__codelineno-17-16" name="__codelineno-17-16"></a><span class="w"> </span><span class="nx">loadThres</span><span class="p">:</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">,</span>
<a href="#__codelineno-17-17" id="__codelineno-17-17" name="__codelineno-17-17"></a><span class="w"> </span><span class="nx">extendRatio</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<a href="#__codelineno-17-18" id="__codelineno-17-18" name="__codelineno-17-18"></a><span class="w"> </span><span class="nx">buckets</span><span class="p">:</span><span class="w"> </span><span class="nb">make</span><span class="p">([]</span><span class="o">*</span><span class="nx">pair</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">),</span>
<a href="#__codelineno-17-19" id="__codelineno-17-19" name="__codelineno-17-19"></a><span class="w"> </span><span class="nx">TOMBSTONE</span><span class="p">:</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">pair</span><span class="p">{</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s">"-1"</span><span class="p">},</span>
<a href="#__codelineno-17-20" id="__codelineno-17-20" name="__codelineno-17-20"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-21" id="__codelineno-17-21" name="__codelineno-17-21"></a><span class="p">}</span>
<a href="#__codelineno-17-22" id="__codelineno-17-22" name="__codelineno-17-22"></a>
<a href="#__codelineno-17-23" id="__codelineno-17-23" name="__codelineno-17-23"></a><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-17-24" id="__codelineno-17-24" name="__codelineno-17-24"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">h</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapOpenAddressing</span><span class="p">)</span><span class="w"> </span><span class="nx">hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-25" id="__codelineno-17-25" name="__codelineno-17-25"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">capacity</span><span class="w"> </span><span class="c1">// キーからハッシュ値を計算する</span>
<a href="#__codelineno-17-26" id="__codelineno-17-26" name="__codelineno-17-26"></a><span class="p">}</span>
<a href="#__codelineno-17-27" id="__codelineno-17-27" name="__codelineno-17-27"></a>
<a href="#__codelineno-17-28" id="__codelineno-17-28" name="__codelineno-17-28"></a><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-17-29" id="__codelineno-17-29" name="__codelineno-17-29"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">h</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapOpenAddressing</span><span class="p">)</span><span class="w"> </span><span class="nx">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="kt">float64</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-30" id="__codelineno-17-30" name="__codelineno-17-30"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kt">float64</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">size</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="kt">float64</span><span class="p">(</span><span class="nx">h</span><span class="p">.</span><span class="nx">capacity</span><span class="p">)</span><span class="w"> </span><span class="c1">// 現在の負荷率を計算する</span>
<a href="#__codelineno-17-31" id="__codelineno-17-31" name="__codelineno-17-31"></a><span class="p">}</span>
<a href="#__codelineno-17-32" id="__codelineno-17-32" name="__codelineno-17-32"></a>
<a href="#__codelineno-17-33" id="__codelineno-17-33" name="__codelineno-17-33"></a><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-17-34" id="__codelineno-17-34" name="__codelineno-17-34"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">h</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapOpenAddressing</span><span class="p">)</span><span class="w"> </span><span class="nx">findBucket</span><span class="p">(</span><span class="nx">key</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-35" id="__codelineno-17-35" name="__codelineno-17-35"></a><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="c1">// 初期インデックスを取得する</span>
<a href="#__codelineno-17-36" id="__codelineno-17-36" name="__codelineno-17-36"></a><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="c1">// 最初に見つかった TOMBSTONE の位置を記録する</span>
<a href="#__codelineno-17-37" id="__codelineno-17-37" name="__codelineno-17-37"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-38" id="__codelineno-17-38" name="__codelineno-17-38"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">].</span><span class="nx">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-39" id="__codelineno-17-39" name="__codelineno-17-39"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-40" id="__codelineno-17-40" name="__codelineno-17-40"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-17-41" id="__codelineno-17-41" name="__codelineno-17-41"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">firstTombstone</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span>
<a href="#__codelineno-17-42" id="__codelineno-17-42" name="__codelineno-17-42"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">TOMBSTONE</span>
<a href="#__codelineno-17-43" id="__codelineno-17-43" name="__codelineno-17-43"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-17-44" id="__codelineno-17-44" name="__codelineno-17-44"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-45" id="__codelineno-17-45" name="__codelineno-17-45"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="c1">// 見つかったインデックスを返す</span>
<a href="#__codelineno-17-46" id="__codelineno-17-46" name="__codelineno-17-46"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-47" id="__codelineno-17-47" name="__codelineno-17-47"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-48" id="__codelineno-17-48" name="__codelineno-17-48"></a><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーの位置を記録する</span>
<a href="#__codelineno-17-49" id="__codelineno-17-49" name="__codelineno-17-49"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-50" id="__codelineno-17-50" name="__codelineno-17-50"></a><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="nx">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">capacity</span><span class="w"> </span><span class="c1">// 線形探索法で探索し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-17-51" id="__codelineno-17-51" name="__codelineno-17-51"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-52" id="__codelineno-17-52" name="__codelineno-17-52"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-17-53" id="__codelineno-17-53" name="__codelineno-17-53"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-54" id="__codelineno-17-54" name="__codelineno-17-54"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">firstTombstone</span>
<a href="#__codelineno-17-55" id="__codelineno-17-55" name="__codelineno-17-55"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-56" id="__codelineno-17-56" name="__codelineno-17-56"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">index</span>
<a href="#__codelineno-17-57" id="__codelineno-17-57" name="__codelineno-17-57"></a><span class="p">}</span>
<a href="#__codelineno-17-58" id="__codelineno-17-58" name="__codelineno-17-58"></a>
<a href="#__codelineno-17-59" id="__codelineno-17-59" name="__codelineno-17-59"></a><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-17-60" id="__codelineno-17-60" name="__codelineno-17-60"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">h</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapOpenAddressing</span><span class="p">)</span><span class="w"> </span><span class="nx">get</span><span class="p">(</span><span class="nx">key</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-61" id="__codelineno-17-61" name="__codelineno-17-61"></a><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">findBucket</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-17-62" id="__codelineno-17-62" name="__codelineno-17-62"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-63" id="__codelineno-17-63" name="__codelineno-17-63"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">].</span><span class="nx">val</span><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-17-64" id="__codelineno-17-64" name="__codelineno-17-64"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-65" id="__codelineno-17-65" name="__codelineno-17-65"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s">""</span><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、"" を返す</span>
<a href="#__codelineno-17-66" id="__codelineno-17-66" name="__codelineno-17-66"></a><span class="p">}</span>
<a href="#__codelineno-17-67" id="__codelineno-17-67" name="__codelineno-17-67"></a>
<a href="#__codelineno-17-68" id="__codelineno-17-68" name="__codelineno-17-68"></a><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-17-69" id="__codelineno-17-69" name="__codelineno-17-69"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">h</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapOpenAddressing</span><span class="p">)</span><span class="w"> </span><span class="nx">put</span><span class="p">(</span><span class="nx">key</span><span class="w"> </span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="w"> </span><span class="kt">string</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-70" id="__codelineno-17-70" name="__codelineno-17-70"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">loadThres</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-71" id="__codelineno-17-71" name="__codelineno-17-71"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">extend</span><span class="p">()</span><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-17-72" id="__codelineno-17-72" name="__codelineno-17-72"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-73" id="__codelineno-17-73" name="__codelineno-17-73"></a><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">findBucket</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-17-74" id="__codelineno-17-74" name="__codelineno-17-74"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-75" id="__codelineno-17-75" name="__codelineno-17-75"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">pair</span><span class="p">{</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="p">}</span><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-17-76" id="__codelineno-17-76" name="__codelineno-17-76"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">size</span><span class="o">++</span>
<a href="#__codelineno-17-77" id="__codelineno-17-77" name="__codelineno-17-77"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-78" id="__codelineno-17-78" name="__codelineno-17-78"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">].</span><span class="nx">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">val</span><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きする</span>
<a href="#__codelineno-17-79" id="__codelineno-17-79" name="__codelineno-17-79"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-80" id="__codelineno-17-80" name="__codelineno-17-80"></a><span class="p">}</span>
<a href="#__codelineno-17-81" id="__codelineno-17-81" name="__codelineno-17-81"></a>
<a href="#__codelineno-17-82" id="__codelineno-17-82" name="__codelineno-17-82"></a><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-17-83" id="__codelineno-17-83" name="__codelineno-17-83"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">h</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapOpenAddressing</span><span class="p">)</span><span class="w"> </span><span class="nx">remove</span><span class="p">(</span><span class="nx">key</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-84" id="__codelineno-17-84" name="__codelineno-17-84"></a><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">findBucket</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-17-85" id="__codelineno-17-85" name="__codelineno-17-85"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-86" id="__codelineno-17-86" name="__codelineno-17-86"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-17-87" id="__codelineno-17-87" name="__codelineno-17-87"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">size</span><span class="o">--</span>
<a href="#__codelineno-17-88" id="__codelineno-17-88" name="__codelineno-17-88"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-89" id="__codelineno-17-89" name="__codelineno-17-89"></a><span class="p">}</span>
<a href="#__codelineno-17-90" id="__codelineno-17-90" name="__codelineno-17-90"></a>
<a href="#__codelineno-17-91" id="__codelineno-17-91" name="__codelineno-17-91"></a><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-17-92" id="__codelineno-17-92" name="__codelineno-17-92"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">h</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapOpenAddressing</span><span class="p">)</span><span class="w"> </span><span class="nx">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-93" id="__codelineno-17-93" name="__codelineno-17-93"></a><span class="w"> </span><span class="nx">oldBuckets</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-17-94" id="__codelineno-17-94" name="__codelineno-17-94"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">extendRatio</span><span class="w"> </span><span class="c1">// 容量を更新する</span>
<a href="#__codelineno-17-95" id="__codelineno-17-95" name="__codelineno-17-95"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">make</span><span class="p">([]</span><span class="o">*</span><span class="nx">pair</span><span class="p">,</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">capacity</span><span class="p">)</span><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-17-96" id="__codelineno-17-96" name="__codelineno-17-96"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="c1">// サイズをリセットする</span>
<a href="#__codelineno-17-97" id="__codelineno-17-97" name="__codelineno-17-97"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-17-98" id="__codelineno-17-98" name="__codelineno-17-98"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">oldBuckets</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-99" id="__codelineno-17-99" name="__codelineno-17-99"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-100" id="__codelineno-17-100" name="__codelineno-17-100"></a><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">put</span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">)</span>
<a href="#__codelineno-17-101" id="__codelineno-17-101" name="__codelineno-17-101"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-102" id="__codelineno-17-102" name="__codelineno-17-102"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-103" id="__codelineno-17-103" name="__codelineno-17-103"></a><span class="p">}</span>
<a href="#__codelineno-17-104" id="__codelineno-17-104" name="__codelineno-17-104"></a>
<a href="#__codelineno-17-105" id="__codelineno-17-105" name="__codelineno-17-105"></a><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-17-106" id="__codelineno-17-106" name="__codelineno-17-106"></a><span class="kd">func</span><span class="w"> </span><span class="p">(</span><span class="nx">h</span><span class="w"> </span><span class="o">*</span><span class="nx">hashMapOpenAddressing</span><span class="p">)</span><span class="w"> </span><span class="nb">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-107" id="__codelineno-17-107" name="__codelineno-17-107"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">buckets</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-108" id="__codelineno-17-108" name="__codelineno-17-108"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-109" id="__codelineno-17-109" name="__codelineno-17-109"></a><span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"nil"</span><span class="p">)</span>
<a href="#__codelineno-17-110" id="__codelineno-17-110" name="__codelineno-17-110"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nx">h</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-111" id="__codelineno-17-111" name="__codelineno-17-111"></a><span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nx">Println</span><span class="p">(</span><span class="s">"TOMBSTONE"</span><span class="p">)</span>
<a href="#__codelineno-17-112" id="__codelineno-17-112" name="__codelineno-17-112"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-17-113" id="__codelineno-17-113" name="__codelineno-17-113"></a><span class="w"> </span><span class="nx">fmt</span><span class="p">.</span><span class="nx">Printf</span><span class="p">(</span><span class="s">"%d -&gt; %s\n"</span><span class="p">,</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">)</span>
<a href="#__codelineno-17-114" id="__codelineno-17-114" name="__codelineno-17-114"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-115" id="__codelineno-17-115" name="__codelineno-17-115"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-17-116" id="__codelineno-17-116" name="__codelineno-17-116"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.swift</span><pre><span></span><code><a href="#__codelineno-18-1" id="__codelineno-18-1" name="__codelineno-18-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-18-2" id="__codelineno-18-2" name="__codelineno-18-2"></a><span class="kd">class</span><span class="w"> </span><span class="nc">HashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-3" id="__codelineno-18-3" name="__codelineno-18-3"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">size</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-18-4" id="__codelineno-18-4" name="__codelineno-18-4"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">capacity</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-18-5" id="__codelineno-18-5" name="__codelineno-18-5"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">loadThres</span><span class="p">:</span><span class="w"> </span><span class="nb">Double</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-18-6" id="__codelineno-18-6" name="__codelineno-18-6"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">extendRatio</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-18-7" id="__codelineno-18-7" name="__codelineno-18-7"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">buckets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="n">Pair</span><span class="p">?]</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-18-8" id="__codelineno-18-8" name="__codelineno-18-8"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">TOMBSTONE</span><span class="p">:</span><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-18-9" id="__codelineno-18-9" name="__codelineno-18-9"></a>
<a href="#__codelineno-18-10" id="__codelineno-18-10" name="__codelineno-18-10"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-18-11" id="__codelineno-18-11" name="__codelineno-18-11"></a><span class="w"> </span><span class="kd">init</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-12" id="__codelineno-18-12" name="__codelineno-18-12"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span>
<a href="#__codelineno-18-13" id="__codelineno-18-13" name="__codelineno-18-13"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">4</span>
<a href="#__codelineno-18-14" id="__codelineno-18-14" name="__codelineno-18-14"></a><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span>
<a href="#__codelineno-18-15" id="__codelineno-18-15" name="__codelineno-18-15"></a><span class="w"> </span><span class="n">extendRatio</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">2</span>
<a href="#__codelineno-18-16" id="__codelineno-18-16" name="__codelineno-18-16"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="n">repeating</span><span class="p">:</span><span class="w"> </span><span class="kc">nil</span><span class="p">,</span><span class="w"> </span><span class="bp">count</span><span class="p">:</span><span class="w"> </span><span class="n">capacity</span><span class="p">)</span>
<a href="#__codelineno-18-17" id="__codelineno-18-17" name="__codelineno-18-17"></a><span class="w"> </span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="s">"-1"</span><span class="p">)</span>
<a href="#__codelineno-18-18" id="__codelineno-18-18" name="__codelineno-18-18"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-19" id="__codelineno-18-19" name="__codelineno-18-19"></a>
<a href="#__codelineno-18-20" id="__codelineno-18-20" name="__codelineno-18-20"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-18-21" id="__codelineno-18-21" name="__codelineno-18-21"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nb">Int</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-22" id="__codelineno-18-22" name="__codelineno-18-22"></a><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span>
<a href="#__codelineno-18-23" id="__codelineno-18-23" name="__codelineno-18-23"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-24" id="__codelineno-18-24" name="__codelineno-18-24"></a>
<a href="#__codelineno-18-25" id="__codelineno-18-25" name="__codelineno-18-25"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-18-26" id="__codelineno-18-26" name="__codelineno-18-26"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nb">Double</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-27" id="__codelineno-18-27" name="__codelineno-18-27"></a><span class="w"> </span><span class="nb">Double</span><span class="p">(</span><span class="n">size</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nb">Double</span><span class="p">(</span><span class="n">capacity</span><span class="p">)</span>
<a href="#__codelineno-18-28" id="__codelineno-18-28" name="__codelineno-18-28"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-29" id="__codelineno-18-29" name="__codelineno-18-29"></a>
<a href="#__codelineno-18-30" id="__codelineno-18-30" name="__codelineno-18-30"></a><span class="w"> </span><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-18-31" id="__codelineno-18-31" name="__codelineno-18-31"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nb">Int</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-32" id="__codelineno-18-32" name="__codelineno-18-32"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-18-33" id="__codelineno-18-33" name="__codelineno-18-33"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">firstTombstone</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span>
<a href="#__codelineno-18-34" id="__codelineno-18-34" name="__codelineno-18-34"></a><span class="w"> </span><span class="c1">// 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-18-35" id="__codelineno-18-35" name="__codelineno-18-35"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-36" id="__codelineno-18-36" name="__codelineno-18-36"></a><span class="w"> </span><span class="c1">// key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-18-37" id="__codelineno-18-37" name="__codelineno-18-37"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">!</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-38" id="__codelineno-18-38" name="__codelineno-18-38"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-18-39" id="__codelineno-18-39" name="__codelineno-18-39"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-40" id="__codelineno-18-40" name="__codelineno-18-40"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">firstTombstone</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
<a href="#__codelineno-18-41" id="__codelineno-18-41" name="__codelineno-18-41"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">TOMBSTONE</span>
<a href="#__codelineno-18-42" id="__codelineno-18-42" name="__codelineno-18-42"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-18-43" id="__codelineno-18-43" name="__codelineno-18-43"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-44" id="__codelineno-18-44" name="__codelineno-18-44"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="c1">// バケットのインデックスを返す</span>
<a href="#__codelineno-18-45" id="__codelineno-18-45" name="__codelineno-18-45"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-46" id="__codelineno-18-46" name="__codelineno-18-46"></a><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-18-47" id="__codelineno-18-47" name="__codelineno-18-47"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-48" id="__codelineno-18-48" name="__codelineno-18-48"></a><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">index</span>
<a href="#__codelineno-18-49" id="__codelineno-18-49" name="__codelineno-18-49"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-50" id="__codelineno-18-50" name="__codelineno-18-50"></a><span class="w"> </span><span class="c1">// バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-18-51" id="__codelineno-18-51" name="__codelineno-18-51"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span>
<a href="#__codelineno-18-52" id="__codelineno-18-52" name="__codelineno-18-52"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-53" id="__codelineno-18-53" name="__codelineno-18-53"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-18-54" id="__codelineno-18-54" name="__codelineno-18-54"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="p">?</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">firstTombstone</span>
<a href="#__codelineno-18-55" id="__codelineno-18-55" name="__codelineno-18-55"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-56" id="__codelineno-18-56" name="__codelineno-18-56"></a>
<a href="#__codelineno-18-57" id="__codelineno-18-57" name="__codelineno-18-57"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-18-58" id="__codelineno-18-58" name="__codelineno-18-58"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nb">String</span><span class="p">?</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-59" id="__codelineno-18-59" name="__codelineno-18-59"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-18-60" id="__codelineno-18-60" name="__codelineno-18-60"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-18-61" id="__codelineno-18-61" name="__codelineno-18-61"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-18-62" id="__codelineno-18-62" name="__codelineno-18-62"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="p">,</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-63" id="__codelineno-18-63" name="__codelineno-18-63"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">!</span><span class="p">.</span><span class="n">val</span>
<a href="#__codelineno-18-64" id="__codelineno-18-64" name="__codelineno-18-64"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-65" id="__codelineno-18-65" name="__codelineno-18-65"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、null を返す</span>
<a href="#__codelineno-18-66" id="__codelineno-18-66" name="__codelineno-18-66"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">nil</span>
<a href="#__codelineno-18-67" id="__codelineno-18-67" name="__codelineno-18-67"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-68" id="__codelineno-18-68" name="__codelineno-18-68"></a>
<a href="#__codelineno-18-69" id="__codelineno-18-69" name="__codelineno-18-69"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-18-70" id="__codelineno-18-70" name="__codelineno-18-70"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="nb">String</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-71" id="__codelineno-18-71" name="__codelineno-18-71"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-18-72" id="__codelineno-18-72" name="__codelineno-18-72"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-73" id="__codelineno-18-73" name="__codelineno-18-73"></a><span class="w"> </span><span class="bp">extend</span><span class="p">()</span>
<a href="#__codelineno-18-74" id="__codelineno-18-74" name="__codelineno-18-74"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-75" id="__codelineno-18-75" name="__codelineno-18-75"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-18-76" id="__codelineno-18-76" name="__codelineno-18-76"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-18-77" id="__codelineno-18-77" name="__codelineno-18-77"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-18-78" id="__codelineno-18-78" name="__codelineno-18-78"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="p">,</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-79" id="__codelineno-18-79" name="__codelineno-18-79"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">!</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">val</span>
<a href="#__codelineno-18-80" id="__codelineno-18-80" name="__codelineno-18-80"></a><span class="w"> </span><span class="k">return</span>
<a href="#__codelineno-18-81" id="__codelineno-18-81" name="__codelineno-18-81"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-82" id="__codelineno-18-82" name="__codelineno-18-82"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-18-83" id="__codelineno-18-83" name="__codelineno-18-83"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-18-84" id="__codelineno-18-84" name="__codelineno-18-84"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span>
<a href="#__codelineno-18-85" id="__codelineno-18-85" name="__codelineno-18-85"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-86" id="__codelineno-18-86" name="__codelineno-18-86"></a>
<a href="#__codelineno-18-87" id="__codelineno-18-87" name="__codelineno-18-87"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-18-88" id="__codelineno-18-88" name="__codelineno-18-88"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="nb">Int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-89" id="__codelineno-18-89" name="__codelineno-18-89"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-18-90" id="__codelineno-18-90" name="__codelineno-18-90"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-18-91" id="__codelineno-18-91" name="__codelineno-18-91"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-18-92" id="__codelineno-18-92" name="__codelineno-18-92"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="p">,</span><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-93" id="__codelineno-18-93" name="__codelineno-18-93"></a><span class="w"> </span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">TOMBSTONE</span>
<a href="#__codelineno-18-94" id="__codelineno-18-94" name="__codelineno-18-94"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span>
<a href="#__codelineno-18-95" id="__codelineno-18-95" name="__codelineno-18-95"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-96" id="__codelineno-18-96" name="__codelineno-18-96"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-97" id="__codelineno-18-97" name="__codelineno-18-97"></a>
<a href="#__codelineno-18-98" id="__codelineno-18-98" name="__codelineno-18-98"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-18-99" id="__codelineno-18-99" name="__codelineno-18-99"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-100" id="__codelineno-18-100" name="__codelineno-18-100"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-18-101" id="__codelineno-18-101" name="__codelineno-18-101"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">bucketsTmp</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">buckets</span>
<a href="#__codelineno-18-102" id="__codelineno-18-102" name="__codelineno-18-102"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-18-103" id="__codelineno-18-103" name="__codelineno-18-103"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span>
<a href="#__codelineno-18-104" id="__codelineno-18-104" name="__codelineno-18-104"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="n">repeating</span><span class="p">:</span><span class="w"> </span><span class="kc">nil</span><span class="p">,</span><span class="w"> </span><span class="bp">count</span><span class="p">:</span><span class="w"> </span><span class="n">capacity</span><span class="p">)</span>
<a href="#__codelineno-18-105" id="__codelineno-18-105" name="__codelineno-18-105"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">0</span>
<a href="#__codelineno-18-106" id="__codelineno-18-106" name="__codelineno-18-106"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-18-107" id="__codelineno-18-107" name="__codelineno-18-107"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-108" id="__codelineno-18-108" name="__codelineno-18-108"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">pair</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-109" id="__codelineno-18-109" name="__codelineno-18-109"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-18-110" id="__codelineno-18-110" name="__codelineno-18-110"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-111" id="__codelineno-18-111" name="__codelineno-18-111"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-112" id="__codelineno-18-112" name="__codelineno-18-112"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-113" id="__codelineno-18-113" name="__codelineno-18-113"></a>
<a href="#__codelineno-18-114" id="__codelineno-18-114" name="__codelineno-18-114"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-18-115" id="__codelineno-18-115" name="__codelineno-18-115"></a><span class="w"> </span><span class="kd">func</span><span class="w"> </span><span class="nf">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-116" id="__codelineno-18-116" name="__codelineno-18-116"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-117" id="__codelineno-18-117" name="__codelineno-18-117"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-118" id="__codelineno-18-118" name="__codelineno-18-118"></a><span class="w"> </span><span class="n">Swift</span><span class="p">.</span><span class="bp">print</span><span class="p">(</span><span class="s">"null"</span><span class="p">)</span>
<a href="#__codelineno-18-119" id="__codelineno-18-119" name="__codelineno-18-119"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-120" id="__codelineno-18-120" name="__codelineno-18-120"></a><span class="w"> </span><span class="n">Swift</span><span class="p">.</span><span class="bp">print</span><span class="p">(</span><span class="s">"TOMBSTONE"</span><span class="p">)</span>
<a href="#__codelineno-18-121" id="__codelineno-18-121" name="__codelineno-18-121"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-18-122" id="__codelineno-18-122" name="__codelineno-18-122"></a><span class="w"> </span><span class="n">Swift</span><span class="p">.</span><span class="bp">print</span><span class="p">(</span><span class="s">"</span><span class="si">\(</span><span class="n">pair</span><span class="p">!.</span><span class="n">key</span><span class="si">)</span><span class="s"> -&gt; </span><span class="si">\(</span><span class="n">pair</span><span class="p">!.</span><span class="n">val</span><span class="si">)</span><span class="s">"</span><span class="p">)</span>
<a href="#__codelineno-18-123" id="__codelineno-18-123" name="__codelineno-18-123"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-124" id="__codelineno-18-124" name="__codelineno-18-124"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-125" id="__codelineno-18-125" name="__codelineno-18-125"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-18-126" id="__codelineno-18-126" name="__codelineno-18-126"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.js</span><pre><span></span><code><a href="#__codelineno-19-1" id="__codelineno-19-1" name="__codelineno-19-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-19-2" id="__codelineno-19-2" name="__codelineno-19-2"></a><span class="kd">class</span><span class="w"> </span><span class="nx">HashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-3" id="__codelineno-19-3" name="__codelineno-19-3"></a><span class="w"> </span><span class="n">#size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-19-4" id="__codelineno-19-4" name="__codelineno-19-4"></a><span class="w"> </span><span class="n">#capacity</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-19-5" id="__codelineno-19-5" name="__codelineno-19-5"></a><span class="w"> </span><span class="n">#loadThres</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-19-6" id="__codelineno-19-6" name="__codelineno-19-6"></a><span class="w"> </span><span class="n">#extendRatio</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-19-7" id="__codelineno-19-7" name="__codelineno-19-7"></a><span class="w"> </span><span class="n">#buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-19-8" id="__codelineno-19-8" name="__codelineno-19-8"></a><span class="w"> </span><span class="n">#TOMBSTONE</span><span class="p">;</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-19-9" id="__codelineno-19-9" name="__codelineno-19-9"></a>
<a href="#__codelineno-19-10" id="__codelineno-19-10" name="__codelineno-19-10"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-19-11" id="__codelineno-19-11" name="__codelineno-19-11"></a><span class="w"> </span><span class="kr">constructor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-12" id="__codelineno-19-12" name="__codelineno-19-12"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-19-13" id="__codelineno-19-13" name="__codelineno-19-13"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">4</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-19-14" id="__codelineno-19-14" name="__codelineno-19-14"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-19-15" id="__codelineno-19-15" name="__codelineno-19-15"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-19-16" id="__codelineno-19-16" name="__codelineno-19-16"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">).</span><span class="nx">fill</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-19-17" id="__codelineno-19-17" name="__codelineno-19-17"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#TOMBSTONE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">Pair</span><span class="p">(</span><span class="o">-</span><span class="mf">1</span><span class="p">,</span><span class="w"> </span><span class="s1">'-1'</span><span class="p">);</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-19-18" id="__codelineno-19-18" name="__codelineno-19-18"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-19" id="__codelineno-19-19" name="__codelineno-19-19"></a>
<a href="#__codelineno-19-20" id="__codelineno-19-20" name="__codelineno-19-20"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-19-21" id="__codelineno-19-21" name="__codelineno-19-21"></a><span class="w"> </span><span class="n">#hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-22" id="__codelineno-19-22" name="__codelineno-19-22"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">;</span>
<a href="#__codelineno-19-23" id="__codelineno-19-23" name="__codelineno-19-23"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-24" id="__codelineno-19-24" name="__codelineno-19-24"></a>
<a href="#__codelineno-19-25" id="__codelineno-19-25" name="__codelineno-19-25"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-19-26" id="__codelineno-19-26" name="__codelineno-19-26"></a><span class="w"> </span><span class="n">#loadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-27" id="__codelineno-19-27" name="__codelineno-19-27"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">;</span>
<a href="#__codelineno-19-28" id="__codelineno-19-28" name="__codelineno-19-28"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-29" id="__codelineno-19-29" name="__codelineno-19-29"></a>
<a href="#__codelineno-19-30" id="__codelineno-19-30" name="__codelineno-19-30"></a><span class="w"> </span><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-19-31" id="__codelineno-19-31" name="__codelineno-19-31"></a><span class="w"> </span><span class="n">#findBucket</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-32" id="__codelineno-19-32" name="__codelineno-19-32"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-19-33" id="__codelineno-19-33" name="__codelineno-19-33"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="mf">1</span><span class="p">;</span>
<a href="#__codelineno-19-34" id="__codelineno-19-34" name="__codelineno-19-34"></a><span class="w"> </span><span class="c1">// 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-19-35" id="__codelineno-19-35" name="__codelineno-19-35"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-36" id="__codelineno-19-36" name="__codelineno-19-36"></a><span class="w"> </span><span class="c1">// key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-19-37" id="__codelineno-19-37" name="__codelineno-19-37"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">].</span><span class="nx">key</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-38" id="__codelineno-19-38" name="__codelineno-19-38"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-19-39" id="__codelineno-19-39" name="__codelineno-19-39"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="o">-</span><span class="mf">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-40" id="__codelineno-19-40" name="__codelineno-19-40"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">firstTombstone</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
<a href="#__codelineno-19-41" id="__codelineno-19-41" name="__codelineno-19-41"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-19-42" id="__codelineno-19-42" name="__codelineno-19-42"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="p">;</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-19-43" id="__codelineno-19-43" name="__codelineno-19-43"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-44" id="__codelineno-19-44" name="__codelineno-19-44"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">index</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケットのインデックスを返す</span>
<a href="#__codelineno-19-45" id="__codelineno-19-45" name="__codelineno-19-45"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-46" id="__codelineno-19-46" name="__codelineno-19-46"></a><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-19-47" id="__codelineno-19-47" name="__codelineno-19-47"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span>
<a href="#__codelineno-19-48" id="__codelineno-19-48" name="__codelineno-19-48"></a><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="o">-</span><span class="mf">1</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<a href="#__codelineno-19-49" id="__codelineno-19-49" name="__codelineno-19-49"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#TOMBSTONE</span>
<a href="#__codelineno-19-50" id="__codelineno-19-50" name="__codelineno-19-50"></a><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-51" id="__codelineno-19-51" name="__codelineno-19-51"></a><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">index</span><span class="p">;</span>
<a href="#__codelineno-19-52" id="__codelineno-19-52" name="__codelineno-19-52"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-53" id="__codelineno-19-53" name="__codelineno-19-53"></a><span class="w"> </span><span class="c1">// バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-19-54" id="__codelineno-19-54" name="__codelineno-19-54"></a><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="nx">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">;</span>
<a href="#__codelineno-19-55" id="__codelineno-19-55" name="__codelineno-19-55"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-56" id="__codelineno-19-56" name="__codelineno-19-56"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-19-57" id="__codelineno-19-57" name="__codelineno-19-57"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="o">-</span><span class="mf">1</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="p">;</span>
<a href="#__codelineno-19-58" id="__codelineno-19-58" name="__codelineno-19-58"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-59" id="__codelineno-19-59" name="__codelineno-19-59"></a>
<a href="#__codelineno-19-60" id="__codelineno-19-60" name="__codelineno-19-60"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-19-61" id="__codelineno-19-61" name="__codelineno-19-61"></a><span class="w"> </span><span class="nx">get</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-62" id="__codelineno-19-62" name="__codelineno-19-62"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-19-63" id="__codelineno-19-63" name="__codelineno-19-63"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#findBucket</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-19-64" id="__codelineno-19-64" name="__codelineno-19-64"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-19-65" id="__codelineno-19-65" name="__codelineno-19-65"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span>
<a href="#__codelineno-19-66" id="__codelineno-19-66" name="__codelineno-19-66"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<a href="#__codelineno-19-67" id="__codelineno-19-67" name="__codelineno-19-67"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#TOMBSTONE</span>
<a href="#__codelineno-19-68" id="__codelineno-19-68" name="__codelineno-19-68"></a><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-69" id="__codelineno-19-69" name="__codelineno-19-69"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">].</span><span class="nx">val</span><span class="p">;</span>
<a href="#__codelineno-19-70" id="__codelineno-19-70" name="__codelineno-19-70"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-71" id="__codelineno-19-71" name="__codelineno-19-71"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、null を返す</span>
<a href="#__codelineno-19-72" id="__codelineno-19-72" name="__codelineno-19-72"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<a href="#__codelineno-19-73" id="__codelineno-19-73" name="__codelineno-19-73"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-74" id="__codelineno-19-74" name="__codelineno-19-74"></a>
<a href="#__codelineno-19-75" id="__codelineno-19-75" name="__codelineno-19-75"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-19-76" id="__codelineno-19-76" name="__codelineno-19-76"></a><span class="w"> </span><span class="nx">put</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-77" id="__codelineno-19-77" name="__codelineno-19-77"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-19-78" id="__codelineno-19-78" name="__codelineno-19-78"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-79" id="__codelineno-19-79" name="__codelineno-19-79"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#extend</span><span class="p">();</span>
<a href="#__codelineno-19-80" id="__codelineno-19-80" name="__codelineno-19-80"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-81" id="__codelineno-19-81" name="__codelineno-19-81"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-19-82" id="__codelineno-19-82" name="__codelineno-19-82"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#findBucket</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-19-83" id="__codelineno-19-83" name="__codelineno-19-83"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-19-84" id="__codelineno-19-84" name="__codelineno-19-84"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span>
<a href="#__codelineno-19-85" id="__codelineno-19-85" name="__codelineno-19-85"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<a href="#__codelineno-19-86" id="__codelineno-19-86" name="__codelineno-19-86"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#TOMBSTONE</span>
<a href="#__codelineno-19-87" id="__codelineno-19-87" name="__codelineno-19-87"></a><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-88" id="__codelineno-19-88" name="__codelineno-19-88"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">].</span><span class="nx">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">val</span><span class="p">;</span>
<a href="#__codelineno-19-89" id="__codelineno-19-89" name="__codelineno-19-89"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-19-90" id="__codelineno-19-90" name="__codelineno-19-90"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-91" id="__codelineno-19-91" name="__codelineno-19-91"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-19-92" id="__codelineno-19-92" name="__codelineno-19-92"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">Pair</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-19-93" id="__codelineno-19-93" name="__codelineno-19-93"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-19-94" id="__codelineno-19-94" name="__codelineno-19-94"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-95" id="__codelineno-19-95" name="__codelineno-19-95"></a>
<a href="#__codelineno-19-96" id="__codelineno-19-96" name="__codelineno-19-96"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-19-97" id="__codelineno-19-97" name="__codelineno-19-97"></a><span class="w"> </span><span class="nx">remove</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-98" id="__codelineno-19-98" name="__codelineno-19-98"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-19-99" id="__codelineno-19-99" name="__codelineno-19-99"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#findBucket</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-19-100" id="__codelineno-19-100" name="__codelineno-19-100"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-19-101" id="__codelineno-19-101" name="__codelineno-19-101"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span>
<a href="#__codelineno-19-102" id="__codelineno-19-102" name="__codelineno-19-102"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<a href="#__codelineno-19-103" id="__codelineno-19-103" name="__codelineno-19-103"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#TOMBSTONE</span>
<a href="#__codelineno-19-104" id="__codelineno-19-104" name="__codelineno-19-104"></a><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-105" id="__codelineno-19-105" name="__codelineno-19-105"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-19-106" id="__codelineno-19-106" name="__codelineno-19-106"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-19-107" id="__codelineno-19-107" name="__codelineno-19-107"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-108" id="__codelineno-19-108" name="__codelineno-19-108"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-109" id="__codelineno-19-109" name="__codelineno-19-109"></a>
<a href="#__codelineno-19-110" id="__codelineno-19-110" name="__codelineno-19-110"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-19-111" id="__codelineno-19-111" name="__codelineno-19-111"></a><span class="w"> </span><span class="n">#extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-112" id="__codelineno-19-112" name="__codelineno-19-112"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-19-113" id="__codelineno-19-113" name="__codelineno-19-113"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">;</span>
<a href="#__codelineno-19-114" id="__codelineno-19-114" name="__codelineno-19-114"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-19-115" id="__codelineno-19-115" name="__codelineno-19-115"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#extendRatio</span><span class="p">;</span>
<a href="#__codelineno-19-116" id="__codelineno-19-116" name="__codelineno-19-116"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="n">#capacity</span><span class="p">).</span><span class="nx">fill</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<a href="#__codelineno-19-117" id="__codelineno-19-117" name="__codelineno-19-117"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span>
<a href="#__codelineno-19-118" id="__codelineno-19-118" name="__codelineno-19-118"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-19-119" id="__codelineno-19-119" name="__codelineno-19-119"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-120" id="__codelineno-19-120" name="__codelineno-19-120"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">pair</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-121" id="__codelineno-19-121" name="__codelineno-19-121"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">put</span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-19-122" id="__codelineno-19-122" name="__codelineno-19-122"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-123" id="__codelineno-19-123" name="__codelineno-19-123"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-124" id="__codelineno-19-124" name="__codelineno-19-124"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-125" id="__codelineno-19-125" name="__codelineno-19-125"></a>
<a href="#__codelineno-19-126" id="__codelineno-19-126" name="__codelineno-19-126"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-19-127" id="__codelineno-19-127" name="__codelineno-19-127"></a><span class="w"> </span><span class="nx">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-128" id="__codelineno-19-128" name="__codelineno-19-128"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-129" id="__codelineno-19-129" name="__codelineno-19-129"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">pair</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-130" id="__codelineno-19-130" name="__codelineno-19-130"></a><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'null'</span><span class="p">);</span>
<a href="#__codelineno-19-131" id="__codelineno-19-131" name="__codelineno-19-131"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">pair</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="n">#TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-132" id="__codelineno-19-132" name="__codelineno-19-132"></a><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'TOMBSTONE'</span><span class="p">);</span>
<a href="#__codelineno-19-133" id="__codelineno-19-133" name="__codelineno-19-133"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-19-134" id="__codelineno-19-134" name="__codelineno-19-134"></a><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">' -&gt; '</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-19-135" id="__codelineno-19-135" name="__codelineno-19-135"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-136" id="__codelineno-19-136" name="__codelineno-19-136"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-137" id="__codelineno-19-137" name="__codelineno-19-137"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-19-138" id="__codelineno-19-138" name="__codelineno-19-138"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.ts</span><pre><span></span><code><a href="#__codelineno-20-1" id="__codelineno-20-1" name="__codelineno-20-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-20-2" id="__codelineno-20-2" name="__codelineno-20-2"></a><span class="kd">class</span><span class="w"> </span><span class="nx">HashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-3" id="__codelineno-20-3" name="__codelineno-20-3"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="nx">size</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-20-4" id="__codelineno-20-4" name="__codelineno-20-4"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="nx">capacity</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-20-5" id="__codelineno-20-5" name="__codelineno-20-5"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="nx">loadThres</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-20-6" id="__codelineno-20-6" name="__codelineno-20-6"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="nx">extendRatio</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-20-7" id="__codelineno-20-7" name="__codelineno-20-7"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="nx">buckets</span><span class="o">:</span><span class="w"> </span><span class="kt">Array</span><span class="o">&lt;</span><span class="nx">Pair</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="kc">null</span><span class="o">&gt;</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-20-8" id="__codelineno-20-8" name="__codelineno-20-8"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="nx">TOMBSTONE</span><span class="o">:</span><span class="w"> </span><span class="kt">Pair</span><span class="p">;</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-20-9" id="__codelineno-20-9" name="__codelineno-20-9"></a>
<a href="#__codelineno-20-10" id="__codelineno-20-10" name="__codelineno-20-10"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-20-11" id="__codelineno-20-11" name="__codelineno-20-11"></a><span class="w"> </span><span class="kr">constructor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-12" id="__codelineno-20-12" name="__codelineno-20-12"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-20-13" id="__codelineno-20-13" name="__codelineno-20-13"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">4</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-20-14" id="__codelineno-20-14" name="__codelineno-20-14"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-20-15" id="__codelineno-20-15" name="__codelineno-20-15"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-20-16" id="__codelineno-20-16" name="__codelineno-20-16"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">capacity</span><span class="p">).</span><span class="nx">fill</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-20-17" id="__codelineno-20-17" name="__codelineno-20-17"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">Pair</span><span class="p">(</span><span class="o">-</span><span class="mf">1</span><span class="p">,</span><span class="w"> </span><span class="s1">'-1'</span><span class="p">);</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-20-18" id="__codelineno-20-18" name="__codelineno-20-18"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-19" id="__codelineno-20-19" name="__codelineno-20-19"></a>
<a href="#__codelineno-20-20" id="__codelineno-20-20" name="__codelineno-20-20"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-20-21" id="__codelineno-20-21" name="__codelineno-20-21"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="nx">hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-22" id="__codelineno-20-22" name="__codelineno-20-22"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">capacity</span><span class="p">;</span>
<a href="#__codelineno-20-23" id="__codelineno-20-23" name="__codelineno-20-23"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-24" id="__codelineno-20-24" name="__codelineno-20-24"></a>
<a href="#__codelineno-20-25" id="__codelineno-20-25" name="__codelineno-20-25"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-20-26" id="__codelineno-20-26" name="__codelineno-20-26"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="nx">loadFactor</span><span class="p">()</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-27" id="__codelineno-20-27" name="__codelineno-20-27"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">capacity</span><span class="p">;</span>
<a href="#__codelineno-20-28" id="__codelineno-20-28" name="__codelineno-20-28"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-29" id="__codelineno-20-29" name="__codelineno-20-29"></a>
<a href="#__codelineno-20-30" id="__codelineno-20-30" name="__codelineno-20-30"></a><span class="w"> </span><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-20-31" id="__codelineno-20-31" name="__codelineno-20-31"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="nx">findBucket</span><span class="p">(</span><span class="nx">key</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-32" id="__codelineno-20-32" name="__codelineno-20-32"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">hashFunc</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-20-33" id="__codelineno-20-33" name="__codelineno-20-33"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="mf">1</span><span class="p">;</span>
<a href="#__codelineno-20-34" id="__codelineno-20-34" name="__codelineno-20-34"></a><span class="w"> </span><span class="c1">// 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-20-35" id="__codelineno-20-35" name="__codelineno-20-35"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-36" id="__codelineno-20-36" name="__codelineno-20-36"></a><span class="w"> </span><span class="c1">// key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-20-37" id="__codelineno-20-37" name="__codelineno-20-37"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="o">!</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="nx">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-38" id="__codelineno-20-38" name="__codelineno-20-38"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-20-39" id="__codelineno-20-39" name="__codelineno-20-39"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="o">-</span><span class="mf">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-40" id="__codelineno-20-40" name="__codelineno-20-40"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">firstTombstone</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">];</span>
<a href="#__codelineno-20-41" id="__codelineno-20-41" name="__codelineno-20-41"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-20-42" id="__codelineno-20-42" name="__codelineno-20-42"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="p">;</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-20-43" id="__codelineno-20-43" name="__codelineno-20-43"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-44" id="__codelineno-20-44" name="__codelineno-20-44"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">index</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケットのインデックスを返す</span>
<a href="#__codelineno-20-45" id="__codelineno-20-45" name="__codelineno-20-45"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-46" id="__codelineno-20-46" name="__codelineno-20-46"></a><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-20-47" id="__codelineno-20-47" name="__codelineno-20-47"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span>
<a href="#__codelineno-20-48" id="__codelineno-20-48" name="__codelineno-20-48"></a><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="o">-</span><span class="mf">1</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<a href="#__codelineno-20-49" id="__codelineno-20-49" name="__codelineno-20-49"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">TOMBSTONE</span>
<a href="#__codelineno-20-50" id="__codelineno-20-50" name="__codelineno-20-50"></a><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-51" id="__codelineno-20-51" name="__codelineno-20-51"></a><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">index</span><span class="p">;</span>
<a href="#__codelineno-20-52" id="__codelineno-20-52" name="__codelineno-20-52"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-53" id="__codelineno-20-53" name="__codelineno-20-53"></a><span class="w"> </span><span class="c1">// バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-20-54" id="__codelineno-20-54" name="__codelineno-20-54"></a><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="nx">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mf">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">capacity</span><span class="p">;</span>
<a href="#__codelineno-20-55" id="__codelineno-20-55" name="__codelineno-20-55"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-56" id="__codelineno-20-56" name="__codelineno-20-56"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-20-57" id="__codelineno-20-57" name="__codelineno-20-57"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">firstTombstone</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="o">-</span><span class="mf">1</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">firstTombstone</span><span class="p">;</span>
<a href="#__codelineno-20-58" id="__codelineno-20-58" name="__codelineno-20-58"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-59" id="__codelineno-20-59" name="__codelineno-20-59"></a>
<a href="#__codelineno-20-60" id="__codelineno-20-60" name="__codelineno-20-60"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-20-61" id="__codelineno-20-61" name="__codelineno-20-61"></a><span class="w"> </span><span class="nx">get</span><span class="p">(</span><span class="nx">key</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-62" id="__codelineno-20-62" name="__codelineno-20-62"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-20-63" id="__codelineno-20-63" name="__codelineno-20-63"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">findBucket</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-20-64" id="__codelineno-20-64" name="__codelineno-20-64"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-20-65" id="__codelineno-20-65" name="__codelineno-20-65"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span>
<a href="#__codelineno-20-66" id="__codelineno-20-66" name="__codelineno-20-66"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<a href="#__codelineno-20-67" id="__codelineno-20-67" name="__codelineno-20-67"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">TOMBSTONE</span>
<a href="#__codelineno-20-68" id="__codelineno-20-68" name="__codelineno-20-68"></a><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-69" id="__codelineno-20-69" name="__codelineno-20-69"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="o">!</span><span class="p">.</span><span class="nx">val</span><span class="p">;</span>
<a href="#__codelineno-20-70" id="__codelineno-20-70" name="__codelineno-20-70"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-71" id="__codelineno-20-71" name="__codelineno-20-71"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、null を返す</span>
<a href="#__codelineno-20-72" id="__codelineno-20-72" name="__codelineno-20-72"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<a href="#__codelineno-20-73" id="__codelineno-20-73" name="__codelineno-20-73"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-74" id="__codelineno-20-74" name="__codelineno-20-74"></a>
<a href="#__codelineno-20-75" id="__codelineno-20-75" name="__codelineno-20-75"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-20-76" id="__codelineno-20-76" name="__codelineno-20-76"></a><span class="w"> </span><span class="nx">put</span><span class="p">(</span><span class="nx">key</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="o">:</span><span class="w"> </span><span class="kt">string</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-77" id="__codelineno-20-77" name="__codelineno-20-77"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-20-78" id="__codelineno-20-78" name="__codelineno-20-78"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-79" id="__codelineno-20-79" name="__codelineno-20-79"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">extend</span><span class="p">();</span>
<a href="#__codelineno-20-80" id="__codelineno-20-80" name="__codelineno-20-80"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-81" id="__codelineno-20-81" name="__codelineno-20-81"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-20-82" id="__codelineno-20-82" name="__codelineno-20-82"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">findBucket</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-20-83" id="__codelineno-20-83" name="__codelineno-20-83"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-20-84" id="__codelineno-20-84" name="__codelineno-20-84"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span>
<a href="#__codelineno-20-85" id="__codelineno-20-85" name="__codelineno-20-85"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<a href="#__codelineno-20-86" id="__codelineno-20-86" name="__codelineno-20-86"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">TOMBSTONE</span>
<a href="#__codelineno-20-87" id="__codelineno-20-87" name="__codelineno-20-87"></a><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-88" id="__codelineno-20-88" name="__codelineno-20-88"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="o">!</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">val</span><span class="p">;</span>
<a href="#__codelineno-20-89" id="__codelineno-20-89" name="__codelineno-20-89"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-20-90" id="__codelineno-20-90" name="__codelineno-20-90"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-91" id="__codelineno-20-91" name="__codelineno-20-91"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-20-92" id="__codelineno-20-92" name="__codelineno-20-92"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">Pair</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-20-93" id="__codelineno-20-93" name="__codelineno-20-93"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-20-94" id="__codelineno-20-94" name="__codelineno-20-94"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-95" id="__codelineno-20-95" name="__codelineno-20-95"></a>
<a href="#__codelineno-20-96" id="__codelineno-20-96" name="__codelineno-20-96"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-20-97" id="__codelineno-20-97" name="__codelineno-20-97"></a><span class="w"> </span><span class="nx">remove</span><span class="p">(</span><span class="nx">key</span><span class="o">:</span><span class="w"> </span><span class="kt">number</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-98" id="__codelineno-20-98" name="__codelineno-20-98"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-20-99" id="__codelineno-20-99" name="__codelineno-20-99"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">findBucket</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
<a href="#__codelineno-20-100" id="__codelineno-20-100" name="__codelineno-20-100"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-20-101" id="__codelineno-20-101" name="__codelineno-20-101"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span>
<a href="#__codelineno-20-102" id="__codelineno-20-102" name="__codelineno-20-102"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span>
<a href="#__codelineno-20-103" id="__codelineno-20-103" name="__codelineno-20-103"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">TOMBSTONE</span>
<a href="#__codelineno-20-104" id="__codelineno-20-104" name="__codelineno-20-104"></a><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-105" id="__codelineno-20-105" name="__codelineno-20-105"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">[</span><span class="nx">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-20-106" id="__codelineno-20-106" name="__codelineno-20-106"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-20-107" id="__codelineno-20-107" name="__codelineno-20-107"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-108" id="__codelineno-20-108" name="__codelineno-20-108"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-109" id="__codelineno-20-109" name="__codelineno-20-109"></a>
<a href="#__codelineno-20-110" id="__codelineno-20-110" name="__codelineno-20-110"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-20-111" id="__codelineno-20-111" name="__codelineno-20-111"></a><span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="nx">extend</span><span class="p">()</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-112" id="__codelineno-20-112" name="__codelineno-20-112"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-20-113" id="__codelineno-20-113" name="__codelineno-20-113"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">;</span>
<a href="#__codelineno-20-114" id="__codelineno-20-114" name="__codelineno-20-114"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-20-115" id="__codelineno-20-115" name="__codelineno-20-115"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">extendRatio</span><span class="p">;</span>
<a href="#__codelineno-20-116" id="__codelineno-20-116" name="__codelineno-20-116"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">capacity</span><span class="p">).</span><span class="nx">fill</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span>
<a href="#__codelineno-20-117" id="__codelineno-20-117" name="__codelineno-20-117"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0</span><span class="p">;</span>
<a href="#__codelineno-20-118" id="__codelineno-20-118" name="__codelineno-20-118"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-20-119" id="__codelineno-20-119" name="__codelineno-20-119"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-120" id="__codelineno-20-120" name="__codelineno-20-120"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">pair</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-121" id="__codelineno-20-121" name="__codelineno-20-121"></a><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">put</span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="p">,</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-20-122" id="__codelineno-20-122" name="__codelineno-20-122"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-123" id="__codelineno-20-123" name="__codelineno-20-123"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-124" id="__codelineno-20-124" name="__codelineno-20-124"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-125" id="__codelineno-20-125" name="__codelineno-20-125"></a>
<a href="#__codelineno-20-126" id="__codelineno-20-126" name="__codelineno-20-126"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-20-127" id="__codelineno-20-127" name="__codelineno-20-127"></a><span class="w"> </span><span class="nx">print</span><span class="p">()</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-128" id="__codelineno-20-128" name="__codelineno-20-128"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">pair</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-129" id="__codelineno-20-129" name="__codelineno-20-129"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">pair</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-130" id="__codelineno-20-130" name="__codelineno-20-130"></a><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'null'</span><span class="p">);</span>
<a href="#__codelineno-20-131" id="__codelineno-20-131" name="__codelineno-20-131"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">pair</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="nx">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-132" id="__codelineno-20-132" name="__codelineno-20-132"></a><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'TOMBSTONE'</span><span class="p">);</span>
<a href="#__codelineno-20-133" id="__codelineno-20-133" name="__codelineno-20-133"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-20-134" id="__codelineno-20-134" name="__codelineno-20-134"></a><span class="w"> </span><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">pair</span><span class="p">.</span><span class="nx">key</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">' -&gt; '</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">pair</span><span class="p">.</span><span class="nx">val</span><span class="p">);</span>
<a href="#__codelineno-20-135" id="__codelineno-20-135" name="__codelineno-20-135"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-136" id="__codelineno-20-136" name="__codelineno-20-136"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-137" id="__codelineno-20-137" name="__codelineno-20-137"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-20-138" id="__codelineno-20-138" name="__codelineno-20-138"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.dart</span><pre><span></span><code><a href="#__codelineno-21-1" id="__codelineno-21-1" name="__codelineno-21-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-21-2" id="__codelineno-21-2" name="__codelineno-21-2"></a><span class="kd">class</span><span class="w"> </span><span class="nc">HashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-3" id="__codelineno-21-3" name="__codelineno-21-3"></a><span class="w"> </span><span class="kd">late</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">_size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-21-4" id="__codelineno-21-4" name="__codelineno-21-4"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">_capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-21-5" id="__codelineno-21-5" name="__codelineno-21-5"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">_loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">3.0</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-21-6" id="__codelineno-21-6" name="__codelineno-21-6"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">_extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-21-7" id="__codelineno-21-7" name="__codelineno-21-7"></a><span class="w"> </span><span class="kd">late</span><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">?&gt;</span><span class="w"> </span><span class="n">_buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-21-8" id="__codelineno-21-8" name="__codelineno-21-8"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="n">_TOMBSTONE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="o">-</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="s2">"-1"</span><span class="p">);</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-21-9" id="__codelineno-21-9" name="__codelineno-21-9"></a>
<a href="#__codelineno-21-10" id="__codelineno-21-10" name="__codelineno-21-10"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-21-11" id="__codelineno-21-11" name="__codelineno-21-11"></a><span class="w"> </span><span class="n">HashMapOpenAddressing</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-12" id="__codelineno-21-12" name="__codelineno-21-12"></a><span class="w"> </span><span class="n">_size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<a href="#__codelineno-21-13" id="__codelineno-21-13" name="__codelineno-21-13"></a><span class="w"> </span><span class="n">_buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">List</span><span class="p">.</span><span class="n">generate</span><span class="p">(</span><span class="n">_capacity</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="kc">null</span><span class="p">);</span>
<a href="#__codelineno-21-14" id="__codelineno-21-14" name="__codelineno-21-14"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-15" id="__codelineno-21-15" name="__codelineno-21-15"></a>
<a href="#__codelineno-21-16" id="__codelineno-21-16" name="__codelineno-21-16"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-21-17" id="__codelineno-21-17" name="__codelineno-21-17"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-18" id="__codelineno-21-18" name="__codelineno-21-18"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">_capacity</span><span class="p">;</span>
<a href="#__codelineno-21-19" id="__codelineno-21-19" name="__codelineno-21-19"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-20" id="__codelineno-21-20" name="__codelineno-21-20"></a>
<a href="#__codelineno-21-21" id="__codelineno-21-21" name="__codelineno-21-21"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-21-22" id="__codelineno-21-22" name="__codelineno-21-22"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-23" id="__codelineno-21-23" name="__codelineno-21-23"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">_size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">_capacity</span><span class="p">;</span>
<a href="#__codelineno-21-24" id="__codelineno-21-24" name="__codelineno-21-24"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-25" id="__codelineno-21-25" name="__codelineno-21-25"></a>
<a href="#__codelineno-21-26" id="__codelineno-21-26" name="__codelineno-21-26"></a><span class="w"> </span><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-21-27" id="__codelineno-21-27" name="__codelineno-21-27"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-28" id="__codelineno-21-28" name="__codelineno-21-28"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-21-29" id="__codelineno-21-29" name="__codelineno-21-29"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="p">;</span>
<a href="#__codelineno-21-30" id="__codelineno-21-30" name="__codelineno-21-30"></a><span class="w"> </span><span class="c1">// 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-21-31" id="__codelineno-21-31" name="__codelineno-21-31"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-32" id="__codelineno-21-32" name="__codelineno-21-32"></a><span class="w"> </span><span class="c1">// key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-21-33" id="__codelineno-21-33" name="__codelineno-21-33"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">!</span><span class="p">.</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-34" id="__codelineno-21-34" name="__codelineno-21-34"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-21-35" id="__codelineno-21-35" name="__codelineno-21-35"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-36" id="__codelineno-21-36" name="__codelineno-21-36"></a><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">firstTombstone</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-21-37" id="__codelineno-21-37" name="__codelineno-21-37"></a><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-21-38" id="__codelineno-21-38" name="__codelineno-21-38"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="p">;</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-21-39" id="__codelineno-21-39" name="__codelineno-21-39"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-40" id="__codelineno-21-40" name="__codelineno-21-40"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケットのインデックスを返す</span>
<a href="#__codelineno-21-41" id="__codelineno-21-41" name="__codelineno-21-41"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-42" id="__codelineno-21-42" name="__codelineno-21-42"></a><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-21-43" id="__codelineno-21-43" name="__codelineno-21-43"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">_TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-44" id="__codelineno-21-44" name="__codelineno-21-44"></a><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">;</span>
<a href="#__codelineno-21-45" id="__codelineno-21-45" name="__codelineno-21-45"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-46" id="__codelineno-21-46" name="__codelineno-21-46"></a><span class="w"> </span><span class="c1">// バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-21-47" id="__codelineno-21-47" name="__codelineno-21-47"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">_capacity</span><span class="p">;</span>
<a href="#__codelineno-21-48" id="__codelineno-21-48" name="__codelineno-21-48"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-49" id="__codelineno-21-49" name="__codelineno-21-49"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-21-50" id="__codelineno-21-50" name="__codelineno-21-50"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">firstTombstone</span><span class="p">;</span>
<a href="#__codelineno-21-51" id="__codelineno-21-51" name="__codelineno-21-51"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-52" id="__codelineno-21-52" name="__codelineno-21-52"></a>
<a href="#__codelineno-21-53" id="__codelineno-21-53" name="__codelineno-21-53"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-21-54" id="__codelineno-21-54" name="__codelineno-21-54"></a><span class="w"> </span><span class="kt">String</span><span class="o">?</span><span class="w"> </span><span class="kd">get</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-55" id="__codelineno-21-55" name="__codelineno-21-55"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-21-56" id="__codelineno-21-56" name="__codelineno-21-56"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-21-57" id="__codelineno-21-57" name="__codelineno-21-57"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-21-58" id="__codelineno-21-58" name="__codelineno-21-58"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">_TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-59" id="__codelineno-21-59" name="__codelineno-21-59"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">!</span><span class="p">.</span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-21-60" id="__codelineno-21-60" name="__codelineno-21-60"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-61" id="__codelineno-21-61" name="__codelineno-21-61"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、null を返す</span>
<a href="#__codelineno-21-62" id="__codelineno-21-62" name="__codelineno-21-62"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span>
<a href="#__codelineno-21-63" id="__codelineno-21-63" name="__codelineno-21-63"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-64" id="__codelineno-21-64" name="__codelineno-21-64"></a>
<a href="#__codelineno-21-65" id="__codelineno-21-65" name="__codelineno-21-65"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-21-66" id="__codelineno-21-66" name="__codelineno-21-66"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="kt">String</span><span class="w"> </span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-67" id="__codelineno-21-67" name="__codelineno-21-67"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-21-68" id="__codelineno-21-68" name="__codelineno-21-68"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">_loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-69" id="__codelineno-21-69" name="__codelineno-21-69"></a><span class="w"> </span><span class="n">extend</span><span class="p">();</span>
<a href="#__codelineno-21-70" id="__codelineno-21-70" name="__codelineno-21-70"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-71" id="__codelineno-21-71" name="__codelineno-21-71"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-21-72" id="__codelineno-21-72" name="__codelineno-21-72"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-21-73" id="__codelineno-21-73" name="__codelineno-21-73"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-21-74" id="__codelineno-21-74" name="__codelineno-21-74"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">_TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-75" id="__codelineno-21-75" name="__codelineno-21-75"></a><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">!</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-21-76" id="__codelineno-21-76" name="__codelineno-21-76"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-21-77" id="__codelineno-21-77" name="__codelineno-21-77"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-78" id="__codelineno-21-78" name="__codelineno-21-78"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-21-79" id="__codelineno-21-79" name="__codelineno-21-79"></a><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-21-80" id="__codelineno-21-80" name="__codelineno-21-80"></a><span class="w"> </span><span class="n">_size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-21-81" id="__codelineno-21-81" name="__codelineno-21-81"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-82" id="__codelineno-21-82" name="__codelineno-21-82"></a>
<a href="#__codelineno-21-83" id="__codelineno-21-83" name="__codelineno-21-83"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-21-84" id="__codelineno-21-84" name="__codelineno-21-84"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">remove</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-85" id="__codelineno-21-85" name="__codelineno-21-85"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-21-86" id="__codelineno-21-86" name="__codelineno-21-86"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-21-87" id="__codelineno-21-87" name="__codelineno-21-87"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-21-88" id="__codelineno-21-88" name="__codelineno-21-88"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">_TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-89" id="__codelineno-21-89" name="__codelineno-21-89"></a><span class="w"> </span><span class="n">_buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-21-90" id="__codelineno-21-90" name="__codelineno-21-90"></a><span class="w"> </span><span class="n">_size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-21-91" id="__codelineno-21-91" name="__codelineno-21-91"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-92" id="__codelineno-21-92" name="__codelineno-21-92"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-93" id="__codelineno-21-93" name="__codelineno-21-93"></a>
<a href="#__codelineno-21-94" id="__codelineno-21-94" name="__codelineno-21-94"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-21-95" id="__codelineno-21-95" name="__codelineno-21-95"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-96" id="__codelineno-21-96" name="__codelineno-21-96"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-21-97" id="__codelineno-21-97" name="__codelineno-21-97"></a><span class="w"> </span><span class="n">List</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">?&gt;</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_buckets</span><span class="p">;</span>
<a href="#__codelineno-21-98" id="__codelineno-21-98" name="__codelineno-21-98"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-21-99" id="__codelineno-21-99" name="__codelineno-21-99"></a><span class="w"> </span><span class="n">_capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">_extendRatio</span><span class="p">;</span>
<a href="#__codelineno-21-100" id="__codelineno-21-100" name="__codelineno-21-100"></a><span class="w"> </span><span class="n">_buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">List</span><span class="p">.</span><span class="n">generate</span><span class="p">(</span><span class="n">_capacity</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="kc">null</span><span class="p">);</span>
<a href="#__codelineno-21-101" id="__codelineno-21-101" name="__codelineno-21-101"></a><span class="w"> </span><span class="n">_size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span><span class="p">;</span>
<a href="#__codelineno-21-102" id="__codelineno-21-102" name="__codelineno-21-102"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-21-103" id="__codelineno-21-103" name="__codelineno-21-103"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="o">?</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-104" id="__codelineno-21-104" name="__codelineno-21-104"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">_TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-105" id="__codelineno-21-105" name="__codelineno-21-105"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-21-106" id="__codelineno-21-106" name="__codelineno-21-106"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-107" id="__codelineno-21-107" name="__codelineno-21-107"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-108" id="__codelineno-21-108" name="__codelineno-21-108"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-109" id="__codelineno-21-109" name="__codelineno-21-109"></a>
<a href="#__codelineno-21-110" id="__codelineno-21-110" name="__codelineno-21-110"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-21-111" id="__codelineno-21-111" name="__codelineno-21-111"></a><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="n">printHashMap</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-112" id="__codelineno-21-112" name="__codelineno-21-112"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="o">?</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">_buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-113" id="__codelineno-21-113" name="__codelineno-21-113"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-114" id="__codelineno-21-114" name="__codelineno-21-114"></a><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="s2">"null"</span><span class="p">);</span>
<a href="#__codelineno-21-115" id="__codelineno-21-115" name="__codelineno-21-115"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">_TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-116" id="__codelineno-21-116" name="__codelineno-21-116"></a><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="s2">"TOMBSTONE"</span><span class="p">);</span>
<a href="#__codelineno-21-117" id="__codelineno-21-117" name="__codelineno-21-117"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-21-118" id="__codelineno-21-118" name="__codelineno-21-118"></a><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="s2">"</span><span class="si">${</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">${</span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="si">}</span><span class="s2">"</span><span class="p">);</span>
<a href="#__codelineno-21-119" id="__codelineno-21-119" name="__codelineno-21-119"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-120" id="__codelineno-21-120" name="__codelineno-21-120"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-121" id="__codelineno-21-121" name="__codelineno-21-121"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-21-122" id="__codelineno-21-122" name="__codelineno-21-122"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.rs</span><pre><span></span><code><a href="#__codelineno-22-1" id="__codelineno-22-1" name="__codelineno-22-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-22-2" id="__codelineno-22-2" name="__codelineno-22-2"></a><span class="k">struct</span><span class="w"> </span><span class="nc">HashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-3" id="__codelineno-22-3" name="__codelineno-22-3"></a><span class="w"> </span><span class="n">size</span><span class="p">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-22-4" id="__codelineno-22-4" name="__codelineno-22-4"></a><span class="w"> </span><span class="n">capacity</span><span class="p">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-22-5" id="__codelineno-22-5" name="__codelineno-22-5"></a><span class="w"> </span><span class="n">load_thres</span><span class="p">:</span><span class="w"> </span><span class="kt">f64</span><span class="p">,</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-22-6" id="__codelineno-22-6" name="__codelineno-22-6"></a><span class="w"> </span><span class="n">extend_ratio</span><span class="p">:</span><span class="w"> </span><span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-22-7" id="__codelineno-22-7" name="__codelineno-22-7"></a><span class="w"> </span><span class="n">buckets</span><span class="p">:</span><span class="w"> </span><span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">Option</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;&gt;</span><span class="p">,</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-22-8" id="__codelineno-22-8" name="__codelineno-22-8"></a><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">:</span><span class="w"> </span><span class="nb">Option</span><span class="o">&lt;</span><span class="n">Pair</span><span class="o">&gt;</span><span class="p">,</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-22-9" id="__codelineno-22-9" name="__codelineno-22-9"></a><span class="p">}</span>
<a href="#__codelineno-22-10" id="__codelineno-22-10" name="__codelineno-22-10"></a>
<a href="#__codelineno-22-11" id="__codelineno-22-11" name="__codelineno-22-11"></a><span class="k">impl</span><span class="w"> </span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-12" id="__codelineno-22-12" name="__codelineno-22-12"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-22-13" id="__codelineno-22-13" name="__codelineno-22-13"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">new</span><span class="p">()</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nc">Self</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-14" id="__codelineno-22-14" name="__codelineno-22-14"></a><span class="w"> </span><span class="bp">Self</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-15" id="__codelineno-22-15" name="__codelineno-22-15"></a><span class="w"> </span><span class="n">size</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<a href="#__codelineno-22-16" id="__codelineno-22-16" name="__codelineno-22-16"></a><span class="w"> </span><span class="n">capacity</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span>
<a href="#__codelineno-22-17" id="__codelineno-22-17" name="__codelineno-22-17"></a><span class="w"> </span><span class="n">load_thres</span><span class="p">:</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">,</span>
<a href="#__codelineno-22-18" id="__codelineno-22-18" name="__codelineno-22-18"></a><span class="w"> </span><span class="n">extend_ratio</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span>
<a href="#__codelineno-22-19" id="__codelineno-22-19" name="__codelineno-22-19"></a><span class="w"> </span><span class="n">buckets</span><span class="p">:</span><span class="w"> </span><span class="nc">vec</span><span class="o">!</span><span class="p">[</span><span class="nb">None</span><span class="p">;</span><span class="w"> </span><span class="mi">4</span><span class="p">],</span>
<a href="#__codelineno-22-20" id="__codelineno-22-20" name="__codelineno-22-20"></a><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">:</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-21" id="__codelineno-22-21" name="__codelineno-22-21"></a><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>
<a href="#__codelineno-22-22" id="__codelineno-22-22" name="__codelineno-22-22"></a><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="s">"-1"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span>
<a href="#__codelineno-22-23" id="__codelineno-22-23" name="__codelineno-22-23"></a><span class="w"> </span><span class="p">}),</span>
<a href="#__codelineno-22-24" id="__codelineno-22-24" name="__codelineno-22-24"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-25" id="__codelineno-22-25" name="__codelineno-22-25"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-26" id="__codelineno-22-26" name="__codelineno-22-26"></a>
<a href="#__codelineno-22-27" id="__codelineno-22-27" name="__codelineno-22-27"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-22-28" id="__codelineno-22-28" name="__codelineno-22-28"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">hash_func</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-29" id="__codelineno-22-29" name="__codelineno-22-29"></a><span class="w"> </span><span class="p">(</span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">usize</span>
<a href="#__codelineno-22-30" id="__codelineno-22-30" name="__codelineno-22-30"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-31" id="__codelineno-22-31" name="__codelineno-22-31"></a>
<a href="#__codelineno-22-32" id="__codelineno-22-32" name="__codelineno-22-32"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-22-33" id="__codelineno-22-33" name="__codelineno-22-33"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">load_factor</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="kt">f64</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-34" id="__codelineno-22-34" name="__codelineno-22-34"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">size</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">f64</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">f64</span>
<a href="#__codelineno-22-35" id="__codelineno-22-35" name="__codelineno-22-35"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-36" id="__codelineno-22-36" name="__codelineno-22-36"></a>
<a href="#__codelineno-22-37" id="__codelineno-22-37" name="__codelineno-22-37"></a><span class="w"> </span><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-22-38" id="__codelineno-22-38" name="__codelineno-22-38"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">find_bucket</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-39" id="__codelineno-22-39" name="__codelineno-22-39"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-22-40" id="__codelineno-22-40" name="__codelineno-22-40"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<a href="#__codelineno-22-41" id="__codelineno-22-41" name="__codelineno-22-41"></a><span class="w"> </span><span class="c1">// 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-22-42" id="__codelineno-22-42" name="__codelineno-22-42"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">is_some</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-43" id="__codelineno-22-43" name="__codelineno-22-43"></a><span class="w"> </span><span class="c1">// key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-22-44" id="__codelineno-22-44" name="__codelineno-22-44"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">as_ref</span><span class="p">().</span><span class="n">unwrap</span><span class="p">().</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-45" id="__codelineno-22-45" name="__codelineno-22-45"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-22-46" id="__codelineno-22-46" name="__codelineno-22-46"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-47" id="__codelineno-22-47" name="__codelineno-22-47"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">first_tombstone</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">usize</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">take</span><span class="p">();</span>
<a href="#__codelineno-22-48" id="__codelineno-22-48" name="__codelineno-22-48"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">TOMBSTONE</span><span class="p">.</span><span class="n">clone</span><span class="p">();</span>
<a href="#__codelineno-22-49" id="__codelineno-22-49" name="__codelineno-22-49"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">usize</span><span class="p">;</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-22-50" id="__codelineno-22-50" name="__codelineno-22-50"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-51" id="__codelineno-22-51" name="__codelineno-22-51"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケットのインデックスを返す</span>
<a href="#__codelineno-22-52" id="__codelineno-22-52" name="__codelineno-22-52"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-53" id="__codelineno-22-53" name="__codelineno-22-53"></a><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-22-54" id="__codelineno-22-54" name="__codelineno-22-54"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-55" id="__codelineno-22-55" name="__codelineno-22-55"></a><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">i32</span><span class="p">;</span>
<a href="#__codelineno-22-56" id="__codelineno-22-56" name="__codelineno-22-56"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-57" id="__codelineno-22-57" name="__codelineno-22-57"></a><span class="w"> </span><span class="c1">// バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-22-58" id="__codelineno-22-58" name="__codelineno-22-58"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-22-59" id="__codelineno-22-59" name="__codelineno-22-59"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-60" id="__codelineno-22-60" name="__codelineno-22-60"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-22-61" id="__codelineno-22-61" name="__codelineno-22-61"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-62" id="__codelineno-22-62" name="__codelineno-22-62"></a><span class="w"> </span><span class="n">index</span>
<a href="#__codelineno-22-63" id="__codelineno-22-63" name="__codelineno-22-63"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-64" id="__codelineno-22-64" name="__codelineno-22-64"></a><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="kt">usize</span>
<a href="#__codelineno-22-65" id="__codelineno-22-65" name="__codelineno-22-65"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-66" id="__codelineno-22-66" name="__codelineno-22-66"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-67" id="__codelineno-22-67" name="__codelineno-22-67"></a>
<a href="#__codelineno-22-68" id="__codelineno-22-68" name="__codelineno-22-68"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-22-69" id="__codelineno-22-69" name="__codelineno-22-69"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="p">-&gt;</span><span class="w"> </span><span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="kt">str</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-70" id="__codelineno-22-70" name="__codelineno-22-70"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-22-71" id="__codelineno-22-71" name="__codelineno-22-71"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">find_bucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-22-72" id="__codelineno-22-72" name="__codelineno-22-72"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-22-73" id="__codelineno-22-73" name="__codelineno-22-73"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">is_some</span><span class="p">()</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-74" id="__codelineno-22-74" name="__codelineno-22-74"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">as_ref</span><span class="p">().</span><span class="n">map</span><span class="p">(</span><span class="o">|</span><span class="n">pair</span><span class="o">|</span><span class="w"> </span><span class="o">&amp;</span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="o">&amp;</span><span class="kt">str</span><span class="p">);</span>
<a href="#__codelineno-22-75" id="__codelineno-22-75" name="__codelineno-22-75"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-76" id="__codelineno-22-76" name="__codelineno-22-76"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、null を返す</span>
<a href="#__codelineno-22-77" id="__codelineno-22-77" name="__codelineno-22-77"></a><span class="w"> </span><span class="nb">None</span>
<a href="#__codelineno-22-78" id="__codelineno-22-78" name="__codelineno-22-78"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-79" id="__codelineno-22-79" name="__codelineno-22-79"></a>
<a href="#__codelineno-22-80" id="__codelineno-22-80" name="__codelineno-22-80"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-22-81" id="__codelineno-22-81" name="__codelineno-22-81"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">:</span><span class="w"> </span><span class="nb">String</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-82" id="__codelineno-22-82" name="__codelineno-22-82"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-22-83" id="__codelineno-22-83" name="__codelineno-22-83"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">load_factor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">load_thres</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-84" id="__codelineno-22-84" name="__codelineno-22-84"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">extend</span><span class="p">();</span>
<a href="#__codelineno-22-85" id="__codelineno-22-85" name="__codelineno-22-85"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-86" id="__codelineno-22-86" name="__codelineno-22-86"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-22-87" id="__codelineno-22-87" name="__codelineno-22-87"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">find_bucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-22-88" id="__codelineno-22-88" name="__codelineno-22-88"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-22-89" id="__codelineno-22-89" name="__codelineno-22-89"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">is_some</span><span class="p">()</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-90" id="__codelineno-22-90" name="__codelineno-22-90"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">as_mut</span><span class="p">().</span><span class="n">unwrap</span><span class="p">().</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-22-91" id="__codelineno-22-91" name="__codelineno-22-91"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-22-92" id="__codelineno-22-92" name="__codelineno-22-92"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-93" id="__codelineno-22-93" name="__codelineno-22-93"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-22-94" id="__codelineno-22-94" name="__codelineno-22-94"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="w"> </span><span class="p">});</span>
<a href="#__codelineno-22-95" id="__codelineno-22-95" name="__codelineno-22-95"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">size</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a href="#__codelineno-22-96" id="__codelineno-22-96" name="__codelineno-22-96"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-97" id="__codelineno-22-97" name="__codelineno-22-97"></a>
<a href="#__codelineno-22-98" id="__codelineno-22-98" name="__codelineno-22-98"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-22-99" id="__codelineno-22-99" name="__codelineno-22-99"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">i32</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-100" id="__codelineno-22-100" name="__codelineno-22-100"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-22-101" id="__codelineno-22-101" name="__codelineno-22-101"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">find_bucket</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-22-102" id="__codelineno-22-102" name="__codelineno-22-102"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-22-103" id="__codelineno-22-103" name="__codelineno-22-103"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">is_some</span><span class="p">()</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-104" id="__codelineno-22-104" name="__codelineno-22-104"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">TOMBSTONE</span><span class="p">.</span><span class="n">clone</span><span class="p">();</span>
<a href="#__codelineno-22-105" id="__codelineno-22-105" name="__codelineno-22-105"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span>
<a href="#__codelineno-22-106" id="__codelineno-22-106" name="__codelineno-22-106"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-107" id="__codelineno-22-107" name="__codelineno-22-107"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-108" id="__codelineno-22-108" name="__codelineno-22-108"></a>
<a href="#__codelineno-22-109" id="__codelineno-22-109" name="__codelineno-22-109"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-22-110" id="__codelineno-22-110" name="__codelineno-22-110"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">extend</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-111" id="__codelineno-22-111" name="__codelineno-22-111"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-22-112" id="__codelineno-22-112" name="__codelineno-22-112"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">buckets_tmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="p">.</span><span class="n">clone</span><span class="p">();</span>
<a href="#__codelineno-22-113" id="__codelineno-22-113" name="__codelineno-22-113"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-22-114" id="__codelineno-22-114" name="__codelineno-22-114"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">extend_ratio</span><span class="p">;</span>
<a href="#__codelineno-22-115" id="__codelineno-22-115" name="__codelineno-22-115"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="fm">vec!</span><span class="p">[</span><span class="nb">None</span><span class="p">;</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">capacity</span><span class="p">];</span>
<a href="#__codelineno-22-116" id="__codelineno-22-116" name="__codelineno-22-116"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-22-117" id="__codelineno-22-117" name="__codelineno-22-117"></a>
<a href="#__codelineno-22-118" id="__codelineno-22-118" name="__codelineno-22-118"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-22-119" id="__codelineno-22-119" name="__codelineno-22-119"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets_tmp</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-120" id="__codelineno-22-120" name="__codelineno-22-120"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">is_none</span><span class="p">()</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-121" id="__codelineno-22-121" name="__codelineno-22-121"></a><span class="w"> </span><span class="k">continue</span><span class="p">;</span>
<a href="#__codelineno-22-122" id="__codelineno-22-122" name="__codelineno-22-122"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-123" id="__codelineno-22-123" name="__codelineno-22-123"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">unwrap</span><span class="p">();</span>
<a href="#__codelineno-22-124" id="__codelineno-22-124" name="__codelineno-22-124"></a>
<a href="#__codelineno-22-125" id="__codelineno-22-125" name="__codelineno-22-125"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-22-126" id="__codelineno-22-126" name="__codelineno-22-126"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-127" id="__codelineno-22-127" name="__codelineno-22-127"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-128" id="__codelineno-22-128" name="__codelineno-22-128"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-22-129" id="__codelineno-22-129" name="__codelineno-22-129"></a><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="nf">print</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-130" id="__codelineno-22-130" name="__codelineno-22-130"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="o">&amp;</span><span class="bp">self</span><span class="p">.</span><span class="n">buckets</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-131" id="__codelineno-22-131" name="__codelineno-22-131"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">is_none</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-132" id="__codelineno-22-132" name="__codelineno-22-132"></a><span class="w"> </span><span class="fm">println!</span><span class="p">(</span><span class="s">"null"</span><span class="p">);</span>
<a href="#__codelineno-22-133" id="__codelineno-22-133" name="__codelineno-22-133"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">&amp;</span><span class="bp">self</span><span class="p">.</span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-134" id="__codelineno-22-134" name="__codelineno-22-134"></a><span class="w"> </span><span class="fm">println!</span><span class="p">(</span><span class="s">"TOMBSTONE"</span><span class="p">);</span>
<a href="#__codelineno-22-135" id="__codelineno-22-135" name="__codelineno-22-135"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-22-136" id="__codelineno-22-136" name="__codelineno-22-136"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">as_ref</span><span class="p">().</span><span class="n">unwrap</span><span class="p">();</span>
<a href="#__codelineno-22-137" id="__codelineno-22-137" name="__codelineno-22-137"></a><span class="w"> </span><span class="fm">println!</span><span class="p">(</span><span class="s">"{} -&gt; {}"</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-22-138" id="__codelineno-22-138" name="__codelineno-22-138"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-139" id="__codelineno-22-139" name="__codelineno-22-139"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-140" id="__codelineno-22-140" name="__codelineno-22-140"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-22-141" id="__codelineno-22-141" name="__codelineno-22-141"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.c</span><pre><span></span><code><a href="#__codelineno-23-1" id="__codelineno-23-1" name="__codelineno-23-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-23-2" id="__codelineno-23-2" name="__codelineno-23-2"></a><span class="k">typedef</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-3" id="__codelineno-23-3" name="__codelineno-23-3"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">size</span><span class="p">;</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-23-4" id="__codelineno-23-4" name="__codelineno-23-4"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-23-5" id="__codelineno-23-5" name="__codelineno-23-5"></a><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">loadThres</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-23-6" id="__codelineno-23-6" name="__codelineno-23-6"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">extendRatio</span><span class="p">;</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-23-7" id="__codelineno-23-7" name="__codelineno-23-7"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">**</span><span class="n">buckets</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-23-8" id="__codelineno-23-8" name="__codelineno-23-8"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">TOMBSTONE</span><span class="p">;</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-23-9" id="__codelineno-23-9" name="__codelineno-23-9"></a><span class="p">}</span><span class="w"> </span><span class="n">HashMapOpenAddressing</span><span class="p">;</span>
<a href="#__codelineno-23-10" id="__codelineno-23-10" name="__codelineno-23-10"></a>
<a href="#__codelineno-23-11" id="__codelineno-23-11" name="__codelineno-23-11"></a><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-23-12" id="__codelineno-23-12" name="__codelineno-23-12"></a><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="nf">newHashMapOpenAddressing</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-13" id="__codelineno-23-13" name="__codelineno-23-13"></a><span class="w"> </span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="p">));</span>
<a href="#__codelineno-23-14" id="__codelineno-23-14" name="__codelineno-23-14"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-23-15" id="__codelineno-23-15" name="__codelineno-23-15"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="p">;</span>
<a href="#__codelineno-23-16" id="__codelineno-23-16" name="__codelineno-23-16"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mf">3.0</span><span class="p">;</span>
<a href="#__codelineno-23-17" id="__codelineno-23-17" name="__codelineno-23-17"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span>
<a href="#__codelineno-23-18" id="__codelineno-23-18" name="__codelineno-23-18"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">**</span><span class="p">)</span><span class="n">calloc</span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="p">));</span>
<a href="#__codelineno-23-19" id="__codelineno-23-19" name="__codelineno-23-19"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">Pair</span><span class="p">));</span>
<a href="#__codelineno-23-20" id="__codelineno-23-20" name="__codelineno-23-20"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<a href="#__codelineno-23-21" id="__codelineno-23-21" name="__codelineno-23-21"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="o">-&gt;</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"-1"</span><span class="p">;</span>
<a href="#__codelineno-23-22" id="__codelineno-23-22" name="__codelineno-23-22"></a>
<a href="#__codelineno-23-23" id="__codelineno-23-23" name="__codelineno-23-23"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">hashMap</span><span class="p">;</span>
<a href="#__codelineno-23-24" id="__codelineno-23-24" name="__codelineno-23-24"></a><span class="p">}</span>
<a href="#__codelineno-23-25" id="__codelineno-23-25" name="__codelineno-23-25"></a>
<a href="#__codelineno-23-26" id="__codelineno-23-26" name="__codelineno-23-26"></a><span class="cm">/* デストラクタ */</span>
<a href="#__codelineno-23-27" id="__codelineno-23-27" name="__codelineno-23-27"></a><span class="kt">void</span><span class="w"> </span><span class="nf">delHashMapOpenAddressing</span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-28" id="__codelineno-23-28" name="__codelineno-23-28"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-29" id="__codelineno-23-29" name="__codelineno-23-29"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<a href="#__codelineno-23-30" id="__codelineno-23-30" name="__codelineno-23-30"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-31" id="__codelineno-23-31" name="__codelineno-23-31"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-23-32" id="__codelineno-23-32" name="__codelineno-23-32"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-23-33" id="__codelineno-23-33" name="__codelineno-23-33"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-34" id="__codelineno-23-34" name="__codelineno-23-34"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-35" id="__codelineno-23-35" name="__codelineno-23-35"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">);</span>
<a href="#__codelineno-23-36" id="__codelineno-23-36" name="__codelineno-23-36"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="p">);</span>
<a href="#__codelineno-23-37" id="__codelineno-23-37" name="__codelineno-23-37"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">hashMap</span><span class="p">);</span>
<a href="#__codelineno-23-38" id="__codelineno-23-38" name="__codelineno-23-38"></a><span class="p">}</span>
<a href="#__codelineno-23-39" id="__codelineno-23-39" name="__codelineno-23-39"></a>
<a href="#__codelineno-23-40" id="__codelineno-23-40" name="__codelineno-23-40"></a><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-23-41" id="__codelineno-23-41" name="__codelineno-23-41"></a><span class="kt">int</span><span class="w"> </span><span class="nf">hashFunc</span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-42" id="__codelineno-23-42" name="__codelineno-23-42"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-23-43" id="__codelineno-23-43" name="__codelineno-23-43"></a><span class="p">}</span>
<a href="#__codelineno-23-44" id="__codelineno-23-44" name="__codelineno-23-44"></a>
<a href="#__codelineno-23-45" id="__codelineno-23-45" name="__codelineno-23-45"></a><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-23-46" id="__codelineno-23-46" name="__codelineno-23-46"></a><span class="kt">double</span><span class="w"> </span><span class="nf">loadFactor</span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-47" id="__codelineno-23-47" name="__codelineno-23-47"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-23-48" id="__codelineno-23-48" name="__codelineno-23-48"></a><span class="p">}</span>
<a href="#__codelineno-23-49" id="__codelineno-23-49" name="__codelineno-23-49"></a>
<a href="#__codelineno-23-50" id="__codelineno-23-50" name="__codelineno-23-50"></a><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-23-51" id="__codelineno-23-51" name="__codelineno-23-51"></a><span class="kt">int</span><span class="w"> </span><span class="nf">findBucket</span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-52" id="__codelineno-23-52" name="__codelineno-23-52"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-23-53" id="__codelineno-23-53" name="__codelineno-23-53"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">-1</span><span class="p">;</span>
<a href="#__codelineno-23-54" id="__codelineno-23-54" name="__codelineno-23-54"></a><span class="w"> </span><span class="c1">// 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-23-55" id="__codelineno-23-55" name="__codelineno-23-55"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-56" id="__codelineno-23-56" name="__codelineno-23-56"></a><span class="w"> </span><span class="c1">// key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-23-57" id="__codelineno-23-57" name="__codelineno-23-57"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-58" id="__codelineno-23-58" name="__codelineno-23-58"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-23-59" id="__codelineno-23-59" name="__codelineno-23-59"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">-1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-60" id="__codelineno-23-60" name="__codelineno-23-60"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">firstTombstone</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-23-61" id="__codelineno-23-61" name="__codelineno-23-61"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-23-62" id="__codelineno-23-62" name="__codelineno-23-62"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="p">;</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-23-63" id="__codelineno-23-63" name="__codelineno-23-63"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-64" id="__codelineno-23-64" name="__codelineno-23-64"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="p">;</span><span class="w"> </span><span class="c1">// バケットのインデックスを返す</span>
<a href="#__codelineno-23-65" id="__codelineno-23-65" name="__codelineno-23-65"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-66" id="__codelineno-23-66" name="__codelineno-23-66"></a><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-23-67" id="__codelineno-23-67" name="__codelineno-23-67"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">-1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-68" id="__codelineno-23-68" name="__codelineno-23-68"></a><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="p">;</span>
<a href="#__codelineno-23-69" id="__codelineno-23-69" name="__codelineno-23-69"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-70" id="__codelineno-23-70" name="__codelineno-23-70"></a><span class="w"> </span><span class="c1">// バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-23-71" id="__codelineno-23-71" name="__codelineno-23-71"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-23-72" id="__codelineno-23-72" name="__codelineno-23-72"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-73" id="__codelineno-23-73" name="__codelineno-23-73"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-23-74" id="__codelineno-23-74" name="__codelineno-23-74"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">-1</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">firstTombstone</span><span class="p">;</span>
<a href="#__codelineno-23-75" id="__codelineno-23-75" name="__codelineno-23-75"></a><span class="p">}</span>
<a href="#__codelineno-23-76" id="__codelineno-23-76" name="__codelineno-23-76"></a>
<a href="#__codelineno-23-77" id="__codelineno-23-77" name="__codelineno-23-77"></a><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-23-78" id="__codelineno-23-78" name="__codelineno-23-78"></a><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="nf">get</span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-79" id="__codelineno-23-79" name="__codelineno-23-79"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-23-80" id="__codelineno-23-80" name="__codelineno-23-80"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-23-81" id="__codelineno-23-81" name="__codelineno-23-81"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-23-82" id="__codelineno-23-82" name="__codelineno-23-82"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-83" id="__codelineno-23-83" name="__codelineno-23-83"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">;</span>
<a href="#__codelineno-23-84" id="__codelineno-23-84" name="__codelineno-23-84"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-85" id="__codelineno-23-85" name="__codelineno-23-85"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、空文字列を返す</span>
<a href="#__codelineno-23-86" id="__codelineno-23-86" name="__codelineno-23-86"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s">""</span><span class="p">;</span>
<a href="#__codelineno-23-87" id="__codelineno-23-87" name="__codelineno-23-87"></a><span class="p">}</span>
<a href="#__codelineno-23-88" id="__codelineno-23-88" name="__codelineno-23-88"></a>
<a href="#__codelineno-23-89" id="__codelineno-23-89" name="__codelineno-23-89"></a><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-23-90" id="__codelineno-23-90" name="__codelineno-23-90"></a><span class="kt">void</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-91" id="__codelineno-23-91" name="__codelineno-23-91"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-23-92" id="__codelineno-23-92" name="__codelineno-23-92"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">loadFactor</span><span class="p">(</span><span class="n">hashMap</span><span class="p">)</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-93" id="__codelineno-23-93" name="__codelineno-23-93"></a><span class="w"> </span><span class="n">extend</span><span class="p">(</span><span class="n">hashMap</span><span class="p">);</span>
<a href="#__codelineno-23-94" id="__codelineno-23-94" name="__codelineno-23-94"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-95" id="__codelineno-23-95" name="__codelineno-23-95"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-23-96" id="__codelineno-23-96" name="__codelineno-23-96"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-23-97" id="__codelineno-23-97" name="__codelineno-23-97"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-23-98" id="__codelineno-23-98" name="__codelineno-23-98"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-99" id="__codelineno-23-99" name="__codelineno-23-99"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-23-100" id="__codelineno-23-100" name="__codelineno-23-100"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">));</span>
<a href="#__codelineno-23-101" id="__codelineno-23-101" name="__codelineno-23-101"></a><span class="w"> </span><span class="n">strcpy</span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-23-102" id="__codelineno-23-102" name="__codelineno-23-102"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">[</span><span class="n">strlen</span><span class="p">(</span><span class="n">val</span><span class="p">)]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sc">'\0'</span><span class="p">;</span>
<a href="#__codelineno-23-103" id="__codelineno-23-103" name="__codelineno-23-103"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
<a href="#__codelineno-23-104" id="__codelineno-23-104" name="__codelineno-23-104"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-105" id="__codelineno-23-105" name="__codelineno-23-105"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-23-106" id="__codelineno-23-106" name="__codelineno-23-106"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">Pair</span><span class="p">));</span>
<a href="#__codelineno-23-107" id="__codelineno-23-107" name="__codelineno-23-107"></a><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">key</span><span class="p">;</span>
<a href="#__codelineno-23-108" id="__codelineno-23-108" name="__codelineno-23-108"></a><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">char</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">malloc</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">));</span>
<a href="#__codelineno-23-109" id="__codelineno-23-109" name="__codelineno-23-109"></a><span class="w"> </span><span class="n">strcpy</span><span class="p">(</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-23-110" id="__codelineno-23-110" name="__codelineno-23-110"></a><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">[</span><span class="n">strlen</span><span class="p">(</span><span class="n">val</span><span class="p">)]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sc">'\0'</span><span class="p">;</span>
<a href="#__codelineno-23-111" id="__codelineno-23-111" name="__codelineno-23-111"></a>
<a href="#__codelineno-23-112" id="__codelineno-23-112" name="__codelineno-23-112"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">pair</span><span class="p">;</span>
<a href="#__codelineno-23-113" id="__codelineno-23-113" name="__codelineno-23-113"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">size</span><span class="o">++</span><span class="p">;</span>
<a href="#__codelineno-23-114" id="__codelineno-23-114" name="__codelineno-23-114"></a><span class="p">}</span>
<a href="#__codelineno-23-115" id="__codelineno-23-115" name="__codelineno-23-115"></a>
<a href="#__codelineno-23-116" id="__codelineno-23-116" name="__codelineno-23-116"></a><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-23-117" id="__codelineno-23-117" name="__codelineno-23-117"></a><span class="kt">void</span><span class="w"> </span><span class="nf">removeItem</span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-118" id="__codelineno-23-118" name="__codelineno-23-118"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-23-119" id="__codelineno-23-119" name="__codelineno-23-119"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="n">key</span><span class="p">);</span>
<a href="#__codelineno-23-120" id="__codelineno-23-120" name="__codelineno-23-120"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-23-121" id="__codelineno-23-121" name="__codelineno-23-121"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-122" id="__codelineno-23-122" name="__codelineno-23-122"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">];</span>
<a href="#__codelineno-23-123" id="__codelineno-23-123" name="__codelineno-23-123"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-23-124" id="__codelineno-23-124" name="__codelineno-23-124"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-23-125" id="__codelineno-23-125" name="__codelineno-23-125"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">index</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="p">;</span>
<a href="#__codelineno-23-126" id="__codelineno-23-126" name="__codelineno-23-126"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">size</span><span class="o">--</span><span class="p">;</span>
<a href="#__codelineno-23-127" id="__codelineno-23-127" name="__codelineno-23-127"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-128" id="__codelineno-23-128" name="__codelineno-23-128"></a><span class="p">}</span>
<a href="#__codelineno-23-129" id="__codelineno-23-129" name="__codelineno-23-129"></a>
<a href="#__codelineno-23-130" id="__codelineno-23-130" name="__codelineno-23-130"></a><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-23-131" id="__codelineno-23-131" name="__codelineno-23-131"></a><span class="kt">void</span><span class="w"> </span><span class="nf">extend</span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-132" id="__codelineno-23-132" name="__codelineno-23-132"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-23-133" id="__codelineno-23-133" name="__codelineno-23-133"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">**</span><span class="n">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">;</span>
<a href="#__codelineno-23-134" id="__codelineno-23-134" name="__codelineno-23-134"></a><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">oldCapacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span>
<a href="#__codelineno-23-135" id="__codelineno-23-135" name="__codelineno-23-135"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-23-136" id="__codelineno-23-136" name="__codelineno-23-136"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">extendRatio</span><span class="p">;</span>
<a href="#__codelineno-23-137" id="__codelineno-23-137" name="__codelineno-23-137"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">**</span><span class="p">)</span><span class="n">calloc</span><span class="p">(</span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="p">));</span>
<a href="#__codelineno-23-138" id="__codelineno-23-138" name="__codelineno-23-138"></a><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<a href="#__codelineno-23-139" id="__codelineno-23-139" name="__codelineno-23-139"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-23-140" id="__codelineno-23-140" name="__codelineno-23-140"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">oldCapacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-141" id="__codelineno-23-141" name="__codelineno-23-141"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<a href="#__codelineno-23-142" id="__codelineno-23-142" name="__codelineno-23-142"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-143" id="__codelineno-23-143" name="__codelineno-23-143"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">hashMap</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-23-144" id="__codelineno-23-144" name="__codelineno-23-144"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-23-145" id="__codelineno-23-145" name="__codelineno-23-145"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">pair</span><span class="p">);</span>
<a href="#__codelineno-23-146" id="__codelineno-23-146" name="__codelineno-23-146"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-147" id="__codelineno-23-147" name="__codelineno-23-147"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-148" id="__codelineno-23-148" name="__codelineno-23-148"></a><span class="w"> </span><span class="n">free</span><span class="p">(</span><span class="n">bucketsTmp</span><span class="p">);</span>
<a href="#__codelineno-23-149" id="__codelineno-23-149" name="__codelineno-23-149"></a><span class="p">}</span>
<a href="#__codelineno-23-150" id="__codelineno-23-150" name="__codelineno-23-150"></a>
<a href="#__codelineno-23-151" id="__codelineno-23-151" name="__codelineno-23-151"></a><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-23-152" id="__codelineno-23-152" name="__codelineno-23-152"></a><span class="kt">void</span><span class="w"> </span><span class="nf">print</span><span class="p">(</span><span class="n">HashMapOpenAddressing</span><span class="w"> </span><span class="o">*</span><span class="n">hashMap</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-153" id="__codelineno-23-153" name="__codelineno-23-153"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">capacity</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-154" id="__codelineno-23-154" name="__codelineno-23-154"></a><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="o">*</span><span class="n">pair</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">buckets</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<a href="#__codelineno-23-155" id="__codelineno-23-155" name="__codelineno-23-155"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nb">NULL</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-156" id="__codelineno-23-156" name="__codelineno-23-156"></a><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"NULL</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<a href="#__codelineno-23-157" id="__codelineno-23-157" name="__codelineno-23-157"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">hashMap</span><span class="o">-&gt;</span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-158" id="__codelineno-23-158" name="__codelineno-23-158"></a><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"TOMBSTONE</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<a href="#__codelineno-23-159" id="__codelineno-23-159" name="__codelineno-23-159"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-23-160" id="__codelineno-23-160" name="__codelineno-23-160"></a><span class="w"> </span><span class="n">printf</span><span class="p">(</span><span class="s">"%d -&gt; %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="o">-&gt;</span><span class="n">val</span><span class="p">);</span>
<a href="#__codelineno-23-161" id="__codelineno-23-161" name="__codelineno-23-161"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-162" id="__codelineno-23-162" name="__codelineno-23-162"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-23-163" id="__codelineno-23-163" name="__codelineno-23-163"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.kt</span><pre><span></span><code><a href="#__codelineno-24-1" id="__codelineno-24-1" name="__codelineno-24-1"></a><span class="cm">/* オープンアドレス法のハッシュテーブル */</span>
<a href="#__codelineno-24-2" id="__codelineno-24-2" name="__codelineno-24-2"></a><span class="kd">class</span><span class="w"> </span><span class="nc">HashMapOpenAddressing</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-3" id="__codelineno-24-3" name="__codelineno-24-3"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">size</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="c1">// キーと値のペアの数</span>
<a href="#__codelineno-24-4" id="__codelineno-24-4" name="__codelineno-24-4"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">capacity</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="c1">// ハッシュテーブルの容量</span>
<a href="#__codelineno-24-5" id="__codelineno-24-5" name="__codelineno-24-5"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">loadThres</span><span class="p">:</span><span class="w"> </span><span class="kt">Double</span><span class="w"> </span><span class="c1">// 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-24-6" id="__codelineno-24-6" name="__codelineno-24-6"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">extendRatio</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="c1">// 容量の拡張倍率</span>
<a href="#__codelineno-24-7" id="__codelineno-24-7" name="__codelineno-24-7"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">buckets</span><span class="p">:</span><span class="w"> </span><span class="n">Array</span><span class="o">&lt;</span><span class="n">Pair?</span><span class="o">&gt;</span><span class="w"> </span><span class="c1">// バケット配列</span>
<a href="#__codelineno-24-8" id="__codelineno-24-8" name="__codelineno-24-8"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">TOMBSTONE</span><span class="p">:</span><span class="w"> </span><span class="n">Pair</span><span class="w"> </span><span class="c1">// 削除マーカー</span>
<a href="#__codelineno-24-9" id="__codelineno-24-9" name="__codelineno-24-9"></a>
<a href="#__codelineno-24-10" id="__codelineno-24-10" name="__codelineno-24-10"></a><span class="w"> </span><span class="cm">/* コンストラクタ */</span>
<a href="#__codelineno-24-11" id="__codelineno-24-11" name="__codelineno-24-11"></a><span class="w"> </span><span class="k">init</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-12" id="__codelineno-24-12" name="__codelineno-24-12"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span>
<a href="#__codelineno-24-13" id="__codelineno-24-13" name="__codelineno-24-13"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">4</span>
<a href="#__codelineno-24-14" id="__codelineno-24-14" name="__codelineno-24-14"></a><span class="w"> </span><span class="n">loadThres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2.0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="m">3.0</span>
<a href="#__codelineno-24-15" id="__codelineno-24-15" name="__codelineno-24-15"></a><span class="w"> </span><span class="n">extendRatio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">2</span>
<a href="#__codelineno-24-16" id="__codelineno-24-16" name="__codelineno-24-16"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrayOfNulls</span><span class="p">(</span><span class="n">capacity</span><span class="p">)</span>
<a href="#__codelineno-24-17" id="__codelineno-24-17" name="__codelineno-24-17"></a><span class="w"> </span><span class="n">TOMBSTONE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="o">-</span><span class="m">1</span><span class="p">,</span><span class="w"> </span><span class="s">"-1"</span><span class="p">)</span>
<a href="#__codelineno-24-18" id="__codelineno-24-18" name="__codelineno-24-18"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-19" id="__codelineno-24-19" name="__codelineno-24-19"></a>
<a href="#__codelineno-24-20" id="__codelineno-24-20" name="__codelineno-24-20"></a><span class="w"> </span><span class="cm">/* ハッシュ関数 */</span>
<a href="#__codelineno-24-21" id="__codelineno-24-21" name="__codelineno-24-21"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">):</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-22" id="__codelineno-24-22" name="__codelineno-24-22"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span>
<a href="#__codelineno-24-23" id="__codelineno-24-23" name="__codelineno-24-23"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-24" id="__codelineno-24-24" name="__codelineno-24-24"></a>
<a href="#__codelineno-24-25" id="__codelineno-24-25" name="__codelineno-24-25"></a><span class="w"> </span><span class="cm">/* 負荷率 */</span>
<a href="#__codelineno-24-26" id="__codelineno-24-26" name="__codelineno-24-26"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">loadFactor</span><span class="p">():</span><span class="w"> </span><span class="kt">Double</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-27" id="__codelineno-24-27" name="__codelineno-24-27"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="n">size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">capacity</span><span class="p">).</span><span class="na">toDouble</span><span class="p">()</span>
<a href="#__codelineno-24-28" id="__codelineno-24-28" name="__codelineno-24-28"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-29" id="__codelineno-24-29" name="__codelineno-24-29"></a>
<a href="#__codelineno-24-30" id="__codelineno-24-30" name="__codelineno-24-30"></a><span class="w"> </span><span class="cm">/* key に対応するバケットのインデックスを探索する */</span>
<a href="#__codelineno-24-31" id="__codelineno-24-31" name="__codelineno-24-31"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">):</span><span class="w"> </span><span class="kt">Int</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-32" id="__codelineno-24-32" name="__codelineno-24-32"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hashFunc</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-24-33" id="__codelineno-24-33" name="__codelineno-24-33"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nv">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="m">1</span>
<a href="#__codelineno-24-34" id="__codelineno-24-34" name="__codelineno-24-34"></a><span class="w"> </span><span class="c1">// 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-24-35" id="__codelineno-24-35" name="__codelineno-24-35"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-36" id="__codelineno-24-36" name="__codelineno-24-36"></a><span class="w"> </span><span class="c1">// key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-24-37" id="__codelineno-24-37" name="__codelineno-24-37"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]?.</span><span class="na">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-38" id="__codelineno-24-38" name="__codelineno-24-38"></a><span class="w"> </span><span class="c1">// それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-24-39" id="__codelineno-24-39" name="__codelineno-24-39"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-40" id="__codelineno-24-40" name="__codelineno-24-40"></a><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">firstTombstone</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span>
<a href="#__codelineno-24-41" id="__codelineno-24-41" name="__codelineno-24-41"></a><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TOMBSTONE</span>
<a href="#__codelineno-24-42" id="__codelineno-24-42" name="__codelineno-24-42"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="c1">// 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-24-43" id="__codelineno-24-43" name="__codelineno-24-43"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-44" id="__codelineno-24-44" name="__codelineno-24-44"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="c1">// バケットのインデックスを返す</span>
<a href="#__codelineno-24-45" id="__codelineno-24-45" name="__codelineno-24-45"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-46" id="__codelineno-24-46" name="__codelineno-24-46"></a><span class="w"> </span><span class="c1">// 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-24-47" id="__codelineno-24-47" name="__codelineno-24-47"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-48" id="__codelineno-24-48" name="__codelineno-24-48"></a><span class="w"> </span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span>
<a href="#__codelineno-24-49" id="__codelineno-24-49" name="__codelineno-24-49"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-50" id="__codelineno-24-50" name="__codelineno-24-50"></a><span class="w"> </span><span class="c1">// バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-24-51" id="__codelineno-24-51" name="__codelineno-24-51"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="n">capacity</span>
<a href="#__codelineno-24-52" id="__codelineno-24-52" name="__codelineno-24-52"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-53" id="__codelineno-24-53" name="__codelineno-24-53"></a><span class="w"> </span><span class="c1">// key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-24-54" id="__codelineno-24-54" name="__codelineno-24-54"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">firstTombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="m">1</span><span class="p">)</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="n">firstTombstone</span>
<a href="#__codelineno-24-55" id="__codelineno-24-55" name="__codelineno-24-55"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-56" id="__codelineno-24-56" name="__codelineno-24-56"></a>
<a href="#__codelineno-24-57" id="__codelineno-24-57" name="__codelineno-24-57"></a><span class="w"> </span><span class="cm">/* 取得操作 */</span>
<a href="#__codelineno-24-58" id="__codelineno-24-58" name="__codelineno-24-58"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">):</span><span class="w"> </span><span class="kt">String?</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-59" id="__codelineno-24-59" name="__codelineno-24-59"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-24-60" id="__codelineno-24-60" name="__codelineno-24-60"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-24-61" id="__codelineno-24-61" name="__codelineno-24-61"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-24-62" id="__codelineno-24-62" name="__codelineno-24-62"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-63" id="__codelineno-24-63" name="__codelineno-24-63"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]?.</span><span class="na">_val</span>
<a href="#__codelineno-24-64" id="__codelineno-24-64" name="__codelineno-24-64"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-65" id="__codelineno-24-65" name="__codelineno-24-65"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、null を返す</span>
<a href="#__codelineno-24-66" id="__codelineno-24-66" name="__codelineno-24-66"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span>
<a href="#__codelineno-24-67" id="__codelineno-24-67" name="__codelineno-24-67"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-68" id="__codelineno-24-68" name="__codelineno-24-68"></a>
<a href="#__codelineno-24-69" id="__codelineno-24-69" name="__codelineno-24-69"></a><span class="w"> </span><span class="cm">/* 追加操作 */</span>
<a href="#__codelineno-24-70" id="__codelineno-24-70" name="__codelineno-24-70"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">,</span><span class="w"> </span><span class="n">_val</span><span class="p">:</span><span class="w"> </span><span class="kt">String</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-71" id="__codelineno-24-71" name="__codelineno-24-71"></a><span class="w"> </span><span class="c1">// 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-24-72" id="__codelineno-24-72" name="__codelineno-24-72"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">loadFactor</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">loadThres</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-73" id="__codelineno-24-73" name="__codelineno-24-73"></a><span class="w"> </span><span class="n">extend</span><span class="p">()</span>
<a href="#__codelineno-24-74" id="__codelineno-24-74" name="__codelineno-24-74"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-75" id="__codelineno-24-75" name="__codelineno-24-75"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-24-76" id="__codelineno-24-76" name="__codelineno-24-76"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-24-77" id="__codelineno-24-77" name="__codelineno-24-77"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-24-78" id="__codelineno-24-78" name="__codelineno-24-78"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-79" id="__codelineno-24-79" name="__codelineno-24-79"></a><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]!!</span><span class="p">.</span><span class="na">_val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">_val</span>
<a href="#__codelineno-24-80" id="__codelineno-24-80" name="__codelineno-24-80"></a><span class="w"> </span><span class="k">return</span>
<a href="#__codelineno-24-81" id="__codelineno-24-81" name="__codelineno-24-81"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-82" id="__codelineno-24-82" name="__codelineno-24-82"></a><span class="w"> </span><span class="c1">// キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-24-83" id="__codelineno-24-83" name="__codelineno-24-83"></a><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Pair</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">_val</span><span class="p">)</span>
<a href="#__codelineno-24-84" id="__codelineno-24-84" name="__codelineno-24-84"></a><span class="w"> </span><span class="n">size</span><span class="o">++</span>
<a href="#__codelineno-24-85" id="__codelineno-24-85" name="__codelineno-24-85"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-86" id="__codelineno-24-86" name="__codelineno-24-86"></a>
<a href="#__codelineno-24-87" id="__codelineno-24-87" name="__codelineno-24-87"></a><span class="w"> </span><span class="cm">/* 削除操作 */</span>
<a href="#__codelineno-24-88" id="__codelineno-24-88" name="__codelineno-24-88"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="n">key</span><span class="p">:</span><span class="w"> </span><span class="kt">Int</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-89" id="__codelineno-24-89" name="__codelineno-24-89"></a><span class="w"> </span><span class="c1">// key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-24-90" id="__codelineno-24-90" name="__codelineno-24-90"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">findBucket</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-24-91" id="__codelineno-24-91" name="__codelineno-24-91"></a><span class="w"> </span><span class="c1">// キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-24-92" id="__codelineno-24-92" name="__codelineno-24-92"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-93" id="__codelineno-24-93" name="__codelineno-24-93"></a><span class="w"> </span><span class="n">buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">TOMBSTONE</span>
<a href="#__codelineno-24-94" id="__codelineno-24-94" name="__codelineno-24-94"></a><span class="w"> </span><span class="n">size</span><span class="o">--</span>
<a href="#__codelineno-24-95" id="__codelineno-24-95" name="__codelineno-24-95"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-96" id="__codelineno-24-96" name="__codelineno-24-96"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-97" id="__codelineno-24-97" name="__codelineno-24-97"></a>
<a href="#__codelineno-24-98" id="__codelineno-24-98" name="__codelineno-24-98"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルの容量を拡張する */</span>
<a href="#__codelineno-24-99" id="__codelineno-24-99" name="__codelineno-24-99"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">extend</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-100" id="__codelineno-24-100" name="__codelineno-24-100"></a><span class="w"> </span><span class="c1">// 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-24-101" id="__codelineno-24-101" name="__codelineno-24-101"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">bucketsTmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">buckets</span>
<a href="#__codelineno-24-102" id="__codelineno-24-102" name="__codelineno-24-102"></a><span class="w"> </span><span class="c1">// 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-24-103" id="__codelineno-24-103" name="__codelineno-24-103"></a><span class="w"> </span><span class="n">capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="n">extendRatio</span>
<a href="#__codelineno-24-104" id="__codelineno-24-104" name="__codelineno-24-104"></a><span class="w"> </span><span class="n">buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">arrayOfNulls</span><span class="p">(</span><span class="n">capacity</span><span class="p">)</span>
<a href="#__codelineno-24-105" id="__codelineno-24-105" name="__codelineno-24-105"></a><span class="w"> </span><span class="n">size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0</span>
<a href="#__codelineno-24-106" id="__codelineno-24-106" name="__codelineno-24-106"></a><span class="w"> </span><span class="c1">// キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-24-107" id="__codelineno-24-107" name="__codelineno-24-107"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">bucketsTmp</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-108" id="__codelineno-24-108" name="__codelineno-24-108"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-109" id="__codelineno-24-109" name="__codelineno-24-109"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="p">.</span><span class="na">_val</span><span class="p">)</span>
<a href="#__codelineno-24-110" id="__codelineno-24-110" name="__codelineno-24-110"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-111" id="__codelineno-24-111" name="__codelineno-24-111"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-112" id="__codelineno-24-112" name="__codelineno-24-112"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-113" id="__codelineno-24-113" name="__codelineno-24-113"></a>
<a href="#__codelineno-24-114" id="__codelineno-24-114" name="__codelineno-24-114"></a><span class="w"> </span><span class="cm">/* ハッシュテーブルを表示する */</span>
<a href="#__codelineno-24-115" id="__codelineno-24-115" name="__codelineno-24-115"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">print</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-116" id="__codelineno-24-116" name="__codelineno-24-116"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-117" id="__codelineno-24-117" name="__codelineno-24-117"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-118" id="__codelineno-24-118" name="__codelineno-24-118"></a><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"null"</span><span class="p">)</span>
<a href="#__codelineno-24-119" id="__codelineno-24-119" name="__codelineno-24-119"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">TOMBSTONE</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-120" id="__codelineno-24-120" name="__codelineno-24-120"></a><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"TOMESTOME"</span><span class="p">)</span>
<a href="#__codelineno-24-121" id="__codelineno-24-121" name="__codelineno-24-121"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a href="#__codelineno-24-122" id="__codelineno-24-122" name="__codelineno-24-122"></a><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"</span><span class="si">${</span><span class="n">pair</span><span class="p">.</span><span class="na">key</span><span class="si">}</span><span class="s"> -&gt; </span><span class="si">${</span><span class="n">pair</span><span class="p">.</span><span class="na">_val</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>
<a href="#__codelineno-24-123" id="__codelineno-24-123" name="__codelineno-24-123"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-124" id="__codelineno-24-124" name="__codelineno-24-124"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-125" id="__codelineno-24-125" name="__codelineno-24-125"></a><span class="w"> </span><span class="p">}</span>
<a href="#__codelineno-24-126" id="__codelineno-24-126" name="__codelineno-24-126"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><span class="filename">hash_map_open_addressing.rb</span><pre><span></span><code><a href="#__codelineno-25-1" id="__codelineno-25-1" name="__codelineno-25-1"></a><span class="c1">### オープンアドレス法のハッシュテーブル ###</span>
<a href="#__codelineno-25-2" id="__codelineno-25-2" name="__codelineno-25-2"></a><span class="k">class</span><span class="w"> </span><span class="nc">HashMapOpenAddressing</span>
<a href="#__codelineno-25-3" id="__codelineno-25-3" name="__codelineno-25-3"></a><span class="w"> </span><span class="no">TOMBSTONE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Pair</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s1">'-1'</span><span class="p">)</span><span class="w"> </span><span class="c1"># 削除マーカー</span>
<a href="#__codelineno-25-4" id="__codelineno-25-4" name="__codelineno-25-4"></a>
<a href="#__codelineno-25-5" id="__codelineno-25-5" name="__codelineno-25-5"></a><span class="w"> </span><span class="c1">### コンストラクタ ###</span>
<a href="#__codelineno-25-6" id="__codelineno-25-6" name="__codelineno-25-6"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span>
<a href="#__codelineno-25-7" id="__codelineno-25-7" name="__codelineno-25-7"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="c1"># キーと値のペアの数</span>
<a href="#__codelineno-25-8" id="__codelineno-25-8" name="__codelineno-25-8"></a><span class="w"> </span><span class="vi">@capacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">4</span><span class="w"> </span><span class="c1"># ハッシュテーブルの容量</span>
<a href="#__codelineno-25-9" id="__codelineno-25-9" name="__codelineno-25-9"></a><span class="w"> </span><span class="vi">@load_thres</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="o">.</span><span class="mi">0</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">3</span><span class="o">.</span><span class="mi">0</span><span class="w"> </span><span class="c1"># 容量の拡張を開始する負荷率のしきい値</span>
<a href="#__codelineno-25-10" id="__codelineno-25-10" name="__codelineno-25-10"></a><span class="w"> </span><span class="vi">@extend_ratio</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="c1"># 容量の拡張倍率</span>
<a href="#__codelineno-25-11" id="__codelineno-25-11" name="__codelineno-25-11"></a><span class="w"> </span><span class="vi">@buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="vi">@capacity</span><span class="p">)</span><span class="w"> </span><span class="c1"># バケット配列</span>
<a href="#__codelineno-25-12" id="__codelineno-25-12" name="__codelineno-25-12"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-13" id="__codelineno-25-13" name="__codelineno-25-13"></a>
<a href="#__codelineno-25-14" id="__codelineno-25-14" name="__codelineno-25-14"></a><span class="w"> </span><span class="c1">### ハッシュ関数 ###</span>
<a href="#__codelineno-25-15" id="__codelineno-25-15" name="__codelineno-25-15"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-25-16" id="__codelineno-25-16" name="__codelineno-25-16"></a><span class="w"> </span><span class="n">key</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="vi">@capacity</span>
<a href="#__codelineno-25-17" id="__codelineno-25-17" name="__codelineno-25-17"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-18" id="__codelineno-25-18" name="__codelineno-25-18"></a>
<a href="#__codelineno-25-19" id="__codelineno-25-19" name="__codelineno-25-19"></a><span class="w"> </span><span class="c1">### 負荷率 ###</span>
<a href="#__codelineno-25-20" id="__codelineno-25-20" name="__codelineno-25-20"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">load_factor</span>
<a href="#__codelineno-25-21" id="__codelineno-25-21" name="__codelineno-25-21"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="vi">@capacity</span>
<a href="#__codelineno-25-22" id="__codelineno-25-22" name="__codelineno-25-22"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-23" id="__codelineno-25-23" name="__codelineno-25-23"></a>
<a href="#__codelineno-25-24" id="__codelineno-25-24" name="__codelineno-25-24"></a><span class="w"> </span><span class="c1">### key に対応するバケットのインデックスを探索する ###</span>
<a href="#__codelineno-25-25" id="__codelineno-25-25" name="__codelineno-25-25"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">find_bucket</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-25-26" id="__codelineno-25-26" name="__codelineno-25-26"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">hash_func</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-25-27" id="__codelineno-25-27" name="__codelineno-25-27"></a><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span>
<a href="#__codelineno-25-28" id="__codelineno-25-28" name="__codelineno-25-28"></a><span class="w"> </span><span class="c1"># 線形探索法で探索し、空のバケットに到達したら終了する</span>
<a href="#__codelineno-25-29" id="__codelineno-25-29" name="__codelineno-25-29"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="o">!</span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">].</span><span class="n">nil?</span>
<a href="#__codelineno-25-30" id="__codelineno-25-30" name="__codelineno-25-30"></a><span class="w"> </span><span class="c1"># key が見つかった場合、対応するバケットのインデックスを返す</span>
<a href="#__codelineno-25-31" id="__codelineno-25-31" name="__codelineno-25-31"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">].</span><span class="n">key</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">key</span>
<a href="#__codelineno-25-32" id="__codelineno-25-32" name="__codelineno-25-32"></a><span class="w"> </span><span class="c1"># それ以前に削除マーカーが見つかっていれば、そのインデックスにキーと値のペアを移す</span>
<a href="#__codelineno-25-33" id="__codelineno-25-33" name="__codelineno-25-33"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span>
<a href="#__codelineno-25-34" id="__codelineno-25-34" name="__codelineno-25-34"></a><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">first_tombstone</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span>
<a href="#__codelineno-25-35" id="__codelineno-25-35" name="__codelineno-25-35"></a><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">TOMBSTONE</span>
<a href="#__codelineno-25-36" id="__codelineno-25-36" name="__codelineno-25-36"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="c1"># 移動後のバケットのインデックスを返す</span>
<a href="#__codelineno-25-37" id="__codelineno-25-37" name="__codelineno-25-37"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-38" id="__codelineno-25-38" name="__codelineno-25-38"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="c1"># バケットのインデックスを返す</span>
<a href="#__codelineno-25-39" id="__codelineno-25-39" name="__codelineno-25-39"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-40" id="__codelineno-25-40" name="__codelineno-25-40"></a><span class="w"> </span><span class="c1"># 最初に見つかった削除マーカーを記録する</span>
<a href="#__codelineno-25-41" id="__codelineno-25-41" name="__codelineno-25-41"></a><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="no">TOMBSTONE</span>
<a href="#__codelineno-25-42" id="__codelineno-25-42" name="__codelineno-25-42"></a><span class="w"> </span><span class="c1"># バケットのインデックスを計算し、末尾を越えたら先頭に戻る</span>
<a href="#__codelineno-25-43" id="__codelineno-25-43" name="__codelineno-25-43"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">index</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="vi">@capacity</span>
<a href="#__codelineno-25-44" id="__codelineno-25-44" name="__codelineno-25-44"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-45" id="__codelineno-25-45" name="__codelineno-25-45"></a><span class="w"> </span><span class="c1"># key が存在しない場合、追加位置のインデックスを返す</span>
<a href="#__codelineno-25-46" id="__codelineno-25-46" name="__codelineno-25-46"></a><span class="w"> </span><span class="n">first_tombstone</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">first_tombstone</span>
<a href="#__codelineno-25-47" id="__codelineno-25-47" name="__codelineno-25-47"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-48" id="__codelineno-25-48" name="__codelineno-25-48"></a>
<a href="#__codelineno-25-49" id="__codelineno-25-49" name="__codelineno-25-49"></a><span class="w"> </span><span class="c1">### 取得操作 ###</span>
<a href="#__codelineno-25-50" id="__codelineno-25-50" name="__codelineno-25-50"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-25-51" id="__codelineno-25-51" name="__codelineno-25-51"></a><span class="w"> </span><span class="c1"># key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-25-52" id="__codelineno-25-52" name="__codelineno-25-52"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">find_bucket</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-25-53" id="__codelineno-25-53" name="__codelineno-25-53"></a><span class="w"> </span><span class="c1"># キーと値のペアが見つかった場合、対応する val を返す</span>
<a href="#__codelineno-25-54" id="__codelineno-25-54" name="__codelineno-25-54"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">].</span><span class="n">val</span><span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="o">[</span><span class="kp">nil</span><span class="p">,</span><span class="w"> </span><span class="no">TOMBSTONE</span><span class="o">].</span><span class="n">include?</span><span class="p">(</span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="p">)</span>
<a href="#__codelineno-25-55" id="__codelineno-25-55" name="__codelineno-25-55"></a><span class="w"> </span><span class="c1"># キーと値のペアが存在しない場合、nil を返す</span>
<a href="#__codelineno-25-56" id="__codelineno-25-56" name="__codelineno-25-56"></a><span class="w"> </span><span class="kp">nil</span>
<a href="#__codelineno-25-57" id="__codelineno-25-57" name="__codelineno-25-57"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-58" id="__codelineno-25-58" name="__codelineno-25-58"></a>
<a href="#__codelineno-25-59" id="__codelineno-25-59" name="__codelineno-25-59"></a><span class="w"> </span><span class="c1">### 追加操作 ###</span>
<a href="#__codelineno-25-60" id="__codelineno-25-60" name="__codelineno-25-60"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">put</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-25-61" id="__codelineno-25-61" name="__codelineno-25-61"></a><span class="w"> </span><span class="c1"># 負荷率がしきい値を超えた場合、容量を拡張する</span>
<a href="#__codelineno-25-62" id="__codelineno-25-62" name="__codelineno-25-62"></a><span class="w"> </span><span class="kp">extend</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">load_factor</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="vi">@load_thres</span>
<a href="#__codelineno-25-63" id="__codelineno-25-63" name="__codelineno-25-63"></a><span class="w"> </span><span class="c1"># key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-25-64" id="__codelineno-25-64" name="__codelineno-25-64"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">find_bucket</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-25-65" id="__codelineno-25-65" name="__codelineno-25-65"></a><span class="w"> </span><span class="c1"># キーと値のペアが見つかった場合、val を上書きして戻る</span>
<a href="#__codelineno-25-66" id="__codelineno-25-66" name="__codelineno-25-66"></a><span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="o">[</span><span class="kp">nil</span><span class="p">,</span><span class="w"> </span><span class="no">TOMBSTONE</span><span class="o">].</span><span class="n">include?</span><span class="p">(</span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="p">)</span>
<a href="#__codelineno-25-67" id="__codelineno-25-67" name="__codelineno-25-67"></a><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">].</span><span class="n">val</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">val</span>
<a href="#__codelineno-25-68" id="__codelineno-25-68" name="__codelineno-25-68"></a><span class="w"> </span><span class="k">return</span>
<a href="#__codelineno-25-69" id="__codelineno-25-69" name="__codelineno-25-69"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-70" id="__codelineno-25-70" name="__codelineno-25-70"></a><span class="w"> </span><span class="c1"># キーと値のペアが存在しない場合、そのペアを追加する</span>
<a href="#__codelineno-25-71" id="__codelineno-25-71" name="__codelineno-25-71"></a><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">Pair</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">val</span><span class="p">)</span>
<a href="#__codelineno-25-72" id="__codelineno-25-72" name="__codelineno-25-72"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span>
<a href="#__codelineno-25-73" id="__codelineno-25-73" name="__codelineno-25-73"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-74" id="__codelineno-25-74" name="__codelineno-25-74"></a>
<a href="#__codelineno-25-75" id="__codelineno-25-75" name="__codelineno-25-75"></a><span class="w"> </span><span class="c1">### 削除操作 ###</span>
<a href="#__codelineno-25-76" id="__codelineno-25-76" name="__codelineno-25-76"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">remove</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-25-77" id="__codelineno-25-77" name="__codelineno-25-77"></a><span class="w"> </span><span class="c1"># key に対応するバケットのインデックスを探索する</span>
<a href="#__codelineno-25-78" id="__codelineno-25-78" name="__codelineno-25-78"></a><span class="w"> </span><span class="n">index</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">find_bucket</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
<a href="#__codelineno-25-79" id="__codelineno-25-79" name="__codelineno-25-79"></a><span class="w"> </span><span class="c1"># キーと値のペアが見つかった場合、削除マーカーで上書きする</span>
<a href="#__codelineno-25-80" id="__codelineno-25-80" name="__codelineno-25-80"></a><span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="o">[</span><span class="kp">nil</span><span class="p">,</span><span class="w"> </span><span class="no">TOMBSTONE</span><span class="o">].</span><span class="n">include?</span><span class="p">(</span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="p">)</span>
<a href="#__codelineno-25-81" id="__codelineno-25-81" name="__codelineno-25-81"></a><span class="w"> </span><span class="vi">@buckets</span><span class="o">[</span><span class="n">index</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="no">TOMBSTONE</span>
<a href="#__codelineno-25-82" id="__codelineno-25-82" name="__codelineno-25-82"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span>
<a href="#__codelineno-25-83" id="__codelineno-25-83" name="__codelineno-25-83"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-84" id="__codelineno-25-84" name="__codelineno-25-84"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-85" id="__codelineno-25-85" name="__codelineno-25-85"></a>
<a href="#__codelineno-25-86" id="__codelineno-25-86" name="__codelineno-25-86"></a><span class="w"> </span><span class="c1">### ハッシュテーブルの容量を拡張する ###</span>
<a href="#__codelineno-25-87" id="__codelineno-25-87" name="__codelineno-25-87"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">extend</span>
<a href="#__codelineno-25-88" id="__codelineno-25-88" name="__codelineno-25-88"></a><span class="w"> </span><span class="c1"># 元のハッシュテーブルを一時保存する</span>
<a href="#__codelineno-25-89" id="__codelineno-25-89" name="__codelineno-25-89"></a><span class="w"> </span><span class="n">buckets_tmp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="vi">@buckets</span>
<a href="#__codelineno-25-90" id="__codelineno-25-90" name="__codelineno-25-90"></a><span class="w"> </span><span class="c1"># 拡張後の新しいハッシュテーブルを初期化する</span>
<a href="#__codelineno-25-91" id="__codelineno-25-91" name="__codelineno-25-91"></a><span class="w"> </span><span class="vi">@capacity</span><span class="w"> </span><span class="o">*=</span><span class="w"> </span><span class="vi">@extend_ratio</span>
<a href="#__codelineno-25-92" id="__codelineno-25-92" name="__codelineno-25-92"></a><span class="w"> </span><span class="vi">@buckets</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="vi">@capacity</span><span class="p">)</span>
<a href="#__codelineno-25-93" id="__codelineno-25-93" name="__codelineno-25-93"></a><span class="w"> </span><span class="vi">@size</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span>
<a href="#__codelineno-25-94" id="__codelineno-25-94" name="__codelineno-25-94"></a><span class="w"> </span><span class="c1"># キーと値のペアを元のハッシュテーブルから新しいハッシュテーブルに移す</span>
<a href="#__codelineno-25-95" id="__codelineno-25-95" name="__codelineno-25-95"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">buckets_tmp</span>
<a href="#__codelineno-25-96" id="__codelineno-25-96" name="__codelineno-25-96"></a><span class="w"> </span><span class="n">put</span><span class="p">(</span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="p">,</span><span class="w"> </span><span class="n">pair</span><span class="o">.</span><span class="n">val</span><span class="p">)</span><span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="o">[</span><span class="kp">nil</span><span class="p">,</span><span class="w"> </span><span class="no">TOMBSTONE</span><span class="o">].</span><span class="n">include?</span><span class="p">(</span><span class="n">pair</span><span class="p">)</span>
<a href="#__codelineno-25-97" id="__codelineno-25-97" name="__codelineno-25-97"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-98" id="__codelineno-25-98" name="__codelineno-25-98"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-99" id="__codelineno-25-99" name="__codelineno-25-99"></a>
<a href="#__codelineno-25-100" id="__codelineno-25-100" name="__codelineno-25-100"></a><span class="w"> </span><span class="c1">### ハッシュテーブルを表示する ###</span>
<a href="#__codelineno-25-101" id="__codelineno-25-101" name="__codelineno-25-101"></a><span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">print</span>
<a href="#__codelineno-25-102" id="__codelineno-25-102" name="__codelineno-25-102"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="vi">@buckets</span>
<a href="#__codelineno-25-103" id="__codelineno-25-103" name="__codelineno-25-103"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">pair</span><span class="o">.</span><span class="n">nil?</span>
<a href="#__codelineno-25-104" id="__codelineno-25-104" name="__codelineno-25-104"></a><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"Nil"</span>
<a href="#__codelineno-25-105" id="__codelineno-25-105" name="__codelineno-25-105"></a><span class="w"> </span><span class="k">elsif</span><span class="w"> </span><span class="n">pair</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="no">TOMBSTONE</span>
<a href="#__codelineno-25-106" id="__codelineno-25-106" name="__codelineno-25-106"></a><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"TOMBSTONE"</span>
<a href="#__codelineno-25-107" id="__codelineno-25-107" name="__codelineno-25-107"></a><span class="w"> </span><span class="k">else</span>
<a href="#__codelineno-25-108" id="__codelineno-25-108" name="__codelineno-25-108"></a><span class="w"> </span><span class="nb">puts</span><span class="w"> </span><span class="s2">"</span><span class="si">#{</span><span class="n">pair</span><span class="o">.</span><span class="n">key</span><span class="si">}</span><span class="s2"> -&gt; </span><span class="si">#{</span><span class="n">pair</span><span class="o">.</span><span class="n">val</span><span class="si">}</span><span class="s2">"</span>
<a href="#__codelineno-25-109" id="__codelineno-25-109" name="__codelineno-25-109"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-110" id="__codelineno-25-110" name="__codelineno-25-110"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-111" id="__codelineno-25-111" name="__codelineno-25-111"></a><span class="w"> </span><span class="k">end</span>
<a href="#__codelineno-25-112" id="__codelineno-25-112" name="__codelineno-25-112"></a><span class="k">end</span>
</code></pre></div>
</div>
</div>
</div>
<h3 id="2">2.   平方探索法<a class="headerlink" href="#2" title="この見出しへのリンク"></a></h3>
<p>平方探索法も、線形探索法と同じくオープンアドレス法の代表的な戦略です。衝突時には一定の歩数ではなく、探索回数の二乗、つまり <span class="arithmatex">\(1, 4, 9, \dots\)</span> 歩を飛び越えます。</p>
<p>主な利点は次のとおりです。</p>
<ul>
<li>探索回数の二乗の距離を飛び越えることで、線形探索法のクラスタリングを緩和しようとします。</li>
<li>より大きな距離を飛び越えて空きを探すことで、データの分布を均等にしやすくなります。</li>
</ul>
<p>ただし、完璧な方法ではありません。</p>
<ul>
<li>ほかより埋まりやすい場所があるという、クラスタリングは依然として生じます。</li>
<li>二乗で距離が増えるため、テーブル全体を探索できない場合があります。空のバケットがあっても、到達できない可能性があります。</li>
</ul>
<h3 id="3">3.   複数のハッシュ関数を使う方法<a class="headerlink" href="#3" title="この見出しへのリンク"></a></h3>
<p>名前のとおり、複数のハッシュ関数 <span class="arithmatex">\(f_1(x)\)</span>、<span class="arithmatex">\(f_2(x)\)</span>、<span class="arithmatex">\(f_3(x)\)</span>、<span class="arithmatex">\(\dots\)</span> を使って探索します。</p>
<ul>
<li><strong>要素の挿入</strong>:<span class="arithmatex">\(f_1(x)\)</span> で衝突したら <span class="arithmatex">\(f_2(x)\)</span> を試し、空きが見つかるまで順に試して挿入します。</li>
<li><strong>要素の探索</strong>:挿入時と同じ順序でハッシュ関数を使い、目的の要素が見つかったら返します。空きに出会うか、すべての関数を試しても見つからなければ、存在しないので <code>None</code> を返します。</li>
</ul>
<p>線形探索法よりクラスタリングは起きにくいものの、複数のハッシュ関数による追加の計算が必要です。</p>
<div class="admonition tip">
<p class="admonition-title">ヒント</p>
<p>線形探索法、平方探索法、複数のハッシュ関数を使う方法のいずれも、オープンアドレス法には「要素を直接削除できない」という問題があります。</p>
</div>
<h2 id="623">6.2.3   プログラミング言語ごとの選択<a class="headerlink" href="#623" title="この見出しへのリンク"></a></h2>
<p>言語ごとに異なる実装戦略が採用されています。いくつか例を挙げます。</p>
<ul>
<li>Python はオープンアドレス法を採用しています。辞書 <code>dict</code> は疑似乱数を使って探索します。</li>
<li>Java はチェイン法を採用しています。JDK 1.8 以降では、<code>HashMap</code> 内の配列の長さが 64 に、連結リストの長さが 8 に達すると、リストを赤黒木へ変換して探索性能を高めます。</li>
<li>Go 1.24 以降、組み込みの <code>map</code> はデフォルトで Swiss Table に基づくオープンアドレス法を使います。Go 1.23 以前はチェイン法で、各バケットに最大 8 ペアを格納し、容量を超えるとオーバーフローバケットをつなぎます。</li>
</ul>
<!-- Source file information -->
<!-- Was this page helpful? -->
<!-- Previous and next pages link -->
<nav aria-label="フッター" class="md-footer__inner md-grid">
<!-- Link to previous page -->
<a aria-label="前: 6.1   ハッシュテーブル" class="md-footer__link md-footer__link--prev" href="../hash_map/" rel="prev">
<div class="md-footer__button md-icon">
<svg class="lucide lucide-arrow-left" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m12 19-7-7 7-7M19 12H5"></path></svg>
</div>
<div class="md-footer__title">
<span class="md-footer__direction">
前
</span>
<div class="md-ellipsis">
6.1   ハッシュテーブル
</div>
</div>
</a>
<!-- Link to next page -->
<a aria-label="次: 6.3   ハッシュアルゴリズム" class="md-footer__link md-footer__link--next" href="../hash_algorithm/" rel="next">
<div class="md-footer__title">
<span class="md-footer__direction">
次
</span>
<div class="md-ellipsis">
6.3   ハッシュアルゴリズム
</div>
</div>
<div class="md-footer__button md-icon">
<svg class="lucide lucide-arrow-right" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M5 12h14M12 5l7 7-7 7"></path></svg>
</div>
</a>
</nav>
<!-- Comment system -->
<!-- Check-in button above comments -->
<h5 align="center" id="__comments">コメント欄で、考えや質問、ご提案をお寄せください。</h5>
<!-- Insert generated snippet here -->
<script async="" crossorigin="anonymous" data-category="Announcements" data-category-id="DIC_kwDOIXtSq84CSZk_" data-emit-metadata="1" data-input-position="top" data-lang="ja" data-mapping="pathname" data-reactions-enabled="1" data-repo="krahets/hello-algo" data-repo-id="R_kgDOIXtSqw" data-strict="1" data-theme="light" src="https://giscus.app/client.js">
</script>
<!-- Synchronize Giscus theme with palette -->
<script>
var giscus = document.querySelector("script[src*=giscus]")
function getGiscusTheme() {
var palette = __md_get("__palette")
var isDark = palette && typeof palette.color === "object" && palette.color.scheme === "slate"
return isDark ? "noborder_dark" : "light"
}
/* Set palette on initial load */
giscus.setAttribute("data-theme", getGiscusTheme())
/* The Giscus client creates the iframe asynchronously with an English title. */
;(function() {
function labelCommentsFrame() {
var frame = document.querySelector("iframe.giscus-frame")
if (!frame) return false
frame.setAttribute("title", "コメント")
return true
}
if (labelCommentsFrame()) return
var observer = new MutationObserver(function() {
if (labelCommentsFrame()) observer.disconnect()
})
observer.observe(giscus.parentElement, { childList: true, subtree: true })
})()
/* Register event handlers after documented loaded */
document.addEventListener("DOMContentLoaded", function() {
var ref = document.querySelector("[data-md-component=palette]")
if (!ref) return
ref.addEventListener("change", function() {
var theme = getGiscusTheme()
/* Instruct Giscus to change theme */
var frame = document.querySelector(".giscus-frame")
if (!frame) return
frame.contentWindow.postMessage(
{ giscus: { setConfig: { theme } } },
"https://giscus.app"
)
})
})
</script>
</article>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
<div class="md-copyright__highlight">
Copyright © 2026 krahets<br/>このサイトのコンテンツのライセンス: <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a>
</div>
</div>
<div class="md-social">
<a class="md-social__link" href="https://github.com/krahets" rel="noopener" target="_blank" title="github.com">
<svg viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2" fill="currentColor"></path></svg>
</a>
<a class="md-social__link" href="https://twitter.com/krahets" rel="noopener" target="_blank" title="twitter.com">
<svg viewbox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M357.2 48h70.6L273.6 224.2 455 464H313L201.7 318.6 74.5 464H3.8l164.9-188.5L-5.2 48h145.6l100.5 132.9zm-24.8 373.8h39.1L119.1 88h-42z" fill="currentColor"></path></svg>
</a>
<a class="md-social__link" href="https://leetcode.cn/u/jyd/" rel="noopener" target="_blank" title="leetcode.cn">
<svg viewbox="0 0 576 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M360.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6m64.6 136.1c-12.5 12.5-12.5 32.8 0 45.3l73.4 73.4-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0zm-274.7 0c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l73.3-73.4c12.5-12.5 12.5-32.8 0-45.3z" fill="currentColor"></path></svg>
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate":null,"base":"../../","features":["content.action.edit","content.code.annotate","content.code.copy","content.tabs.link","content.tooltips","navigation.indexes","navigation.tracking","search.highlight","search.share","search.suggest","toc.follow"],"search":"../../assets/javascripts/workers/search.b6b7e04f.min.js","tags":null,"translations":{"clipboard.copied":"コピーしました","clipboard.copy":"クリップボードへコピー","search.result.more.one":"このページ内にもう1件見つかりました","search.result.more.other":"このページ内にあと#件見つかりました","search.result.none":"何も見つかりませんでした","search.result.one":"1件見つかりました","search.result.other":"#件見つかりました","search.result.placeholder":"検索キーワードを入力してください","search.result.term.missing":"検索に含まれない","select.version":"バージョン切り替え"},"version":null}</script>
<script src="../../assets/javascripts/bundle.4b65e87068ac38235d9f2cf93ce9d63bc8183b8a230a27c7b45fcfe8aa24e133.min.js"></script>
<script src="../../javascripts/mathjax.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js"></script>
<script src="../../javascripts/animation_player.js"></script>
<script defer="" src="/assets/figure-svg/js/bcdea376f01bc2bc0cac7c6c.js"></script><script defer="" src="/assets/figure-svg/js/e84f59519170c0f5ef238548.js"></script><script defer="" src="/assets/figure-svg/js/99a707e9f0a14d8280f16808.js"></script><script defer="" src="/assets/figure-svg/js/855fb5bb73c22cf5c2cea474.js"></script></body>
</html>