[python] トライ木の実装 はてなブックマーク - [python] トライ木の実装

import collections class TriNode(object): def __init__(self): self.children = collections.defaultdict(TriNode) self.is_word = False class TriTree: def __init__(self): self.root = TriNode() def insert(self, word): current = self.root for letter in word: current = current.children[letter] current.is_word = True def search(self, word): current = self.root for letter in word: current = current.children[letter] if current is None: return False return current.is_word def startswith(self, prefix): current = self.root for letter in prefix: current = current.children[letter] if

[python] 優先度付きキューの実装 はてなブックマーク - [python] 優先度付きキューの実装

import sys class PriorityQueueNode(object): def __init__(self, obj, key): self.obj = obj self.key = key def __repr__(self): return str(self.obj) + ': ' + str(self.key) class PriorityQueue(object): def __init__(self): self.array = [] # 要素を追加 def insert(self, node): self.array.append(node) return self.array[-1] # 最も高い優先度のnodeを取り出し def extract_min(self): if self.array is None: return None minimum =

[python] ハッシュテーブルの実装 はてなブックマーク - [python] ハッシュテーブルの実装

class Item(object): def __init__(self, key, value): self.key = key self.value = value class HashTable(object): def __init__(self, size=10): self.size = size self.array = [[] for _ in range(self.size)] def _hash_function(self, key): return key % self.size def set(self, key, value): hash_index = self._hash_function(key) for node in self.array[hash_index]: if node.key == key: node.value = value return self.array[hash_index].append(Item(key, value)) def get(self, key): hash_index = self._hash_function(key) for node in self.array[hash_index]: if node.key == key: return

[python] ヒープの実装 はてなブックマーク - [python] ヒープの実装

class MinHeap(object): def __init__(self): self.array = [] def __len__(self): return len(self.array) def extract_min(self): if not self.array: return None if len(self.array) == 1: return self.array.pop(0) minimum = self.array[0] self.array[0] = self.array.pop(-1) self._bubble_down(index=0) return minimum def peek_min(self): return self.array[0] if self.array else None def insert(self, key): if key is None: raise TypeError('key cannot be none') self.array.append(key) self._bubble_up(index=len(self.array) - 1) def _bubble_down(self, index): min_child_index = self._find_smaller_child(index) if min_child_index == -1: return if self.array[index]

[python] キューの実装 はてなブックマーク - [python] キューの実装

scratch # queueのベースクラスを作成 # isEmpty, lenメソッド, 全nodeの一覧を持つ class AbstractQueue: def __init__(self): self.top = 0 def isEmpty(self): return self.top == 0 def __len__(self): return self.top def __str__(self): result = '------\n' for element in self: result += str(element) + '\n' return

[python] スタックの実装 はてなブックマーク - [python] スタックの実装

scratch class AbstructStack: def __init__(self): self.top = 0 def isEmpty(self): return self.top == 0 def __len__(self): return self.top def __str__(self): result = '------\n' for element in self: result += str(element) + '\n' return result[:-1] + '\n------' class StackNode(object): def __init__(self, value): self.value = value self.next = None class LinkedListStack(AbstructStack): def __init__(self): AbstructStack.__init__(self) self.front = 0 def dequeue(self): if self.isEmpty(): raise IndexError('stack is empty') value = self.front.value self.front = self.front.next self.top

[python] クイックソートの実装 はてなブックマーク - [python] クイックソートの実装

# https://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88 # http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/quick-sort.html def quick_sort(array, first, last): # あるpivotをもとに、そこから左だけはpivot以下の値だけに、右はpivot以上の値だけにする # 左と右の配列に対してq

[python] バブルソートの実装 はてなブックマーク - [python] バブルソートの実装

# https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88 # 交換を最大 n-1 , n-2, ... 1回 = n(n-1)/2 回 -> O(n^2) def bubble_sort(array): # 最初は0からn-1まで探索し一番大きい要素をn-1に # 次は0からn-2まで一番大きい要素をn-2

[python] マージソートの実装 はてなブックマーク - [python] マージソートの実装

# https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88 # http://www.ics.kagoshima-u.ac.jp/~fuchida/edu/algorithm/sort-algorithm/merge-sort.html def merge_sort(array): # 配列の長さが1ならソート不要なので返す if len(array) <= 1: return array # それより長いなら半分に分割してそれぞれにマージソートを適用する mid = len(array) // 2 left

ビット操作の基礎 はてなブックマーク - ビット操作の基礎

overview bit操作に慣れ親しんでおく(特にXOR) -16 >> 2 == -4 maskについて理解する 最下位ビットを0にクリアする方法を知る 15 & ~1 brute-for

文字コードとは はてなブックマーク - 文字コードとは

文字コード 広義では、文字にバイト表現を割り当て、その対応表を文字コードと呼ぶ 文字集合と符号化方式 文字コードは文字集合(ccs)と符号化方式(

5Lと3Lのボトルで4Lの水を計る はてなブックマーク - 5Lと3Lのボトルで4Lの水を計る

水の移し方 3Lの水をくんで、5Lのボトルに移す。 その後5Lのボトルをいっぱいにしても捨てなければいけないので、 常に3Lの水をくんで5Lの水に

貪欲法の基礎 はてなブックマーク - 貪欲法の基礎

overview 各ステップにおいて、局所的な最適な決定を繰り返すソリューション 必ずしも最適解を導くわけではない bootcamp 1,5,10,25,50,100セントを使