2005-01-01から1年間の記事一覧

web archive

二分木の できあがったプログラムが ないと、ブツブツいってても しかたないので、net で 捜してみた*1。 http://mrl.nyu.edu/~harper/code/binsearchtree.c (作者は Harper Langston) さっそく ダウンロード。 ついでに コンパイルしてみる。 $w3m - dump m…

useless tips

C++ World の tutorial も、二分木のところを なんとか 訳し終えたので、ここ 10日ほどは 訳文のコピーを ひっくりかえしたり、脳内妄想(?)コードを メモったりしていた。 データから 二分木をつくる 簡単な コードを 書いて、コンパイル。 実行させると、い…

useless tips

C の ライブラリ stdlib.h に、二分木検索のための bsearch 関数が 含まれてるのは 知ってたけど、比較的最近では*1 search.h という ヘッダファイルも 用意されている。 Standard C library 92年版には 載ってませんでした。 search.h で 定義されている 関…

useless tips

E. Kasner の 「数学の世界」を 読むと、数学の言葉と 日常に 使われてる言葉との くいちがいについて 述べられている。 数学には group, family, ring, simple curve, limit などという やさしい言葉が たくさん でてきます。 ただ これらの言葉は、日常の…

はじめての C

7月11日分の 日記が まちがっていたので、削除しました。 訂正分は 次のとおりです。 以前 つくった クイックソートプログラムを 元にして、シェルソートの コードを 書いてみる。 http://www4.kcn.ne.jp/~yoitiro/hatena/knr2nd_4.txt はじめに shell_sort …

web archive

いつのまにか Vine Linux で 3.2 β4 が でている。 数日中にも 3.2 rc に 移行するらしい。 http://beta.vinelinux.org/ はねさんの Linux Personal Workstation でも 早速、3.2 に 対応できるよう テスト版で 追っかけています。 http://www.lain.org/wingl…

はじめての C

「二分木 続き 12」 int skip_delete(struct Skip **list, int search_key) { struct Skip *update[MAX_LEVEL] = {0}; struct Skip *x; int i; x = *list; for (i = (*list)->level - 1; i >= 0; i--) { while (x->forward[i] != NULL && x->forward[i]->dat…

はじめての C

「二分木 続き 11」 さて、skip list の 構築と 削除の 実際の algorithm ですが、ここが (一番) おもしろいところです。 もっとも 効率的とは いえませんが、これは もっとも シンプルなものの 1つです。 skip list の いいところの 1つは、それを 理解する…

本の整理

家に どんな本が あるのか、整理していたのが やっと 終わった (5000冊以上 ?)。 本来なら いつでも 手に取れるところに 置きたいのだが、さすがに それは 無理のようだ。 興味あります ? → コチラ

はじめての C

「二分木 続き 10」 skip list は、ランダム数 = 乱数を 使うことで、効率のよい 構造を つくりあげる、確率的な - probabilistic - データ構造です。 その方法は、(以前 つくった) ランダムに構築する - randomized - 二分木と 同じく、乱数を その 挿入 al…

はじめての C

「二分木 続き 9」 int avl_remove(struct Avl **tree, struct Avl *old_item) { struct Avl *heir; int rv; /* Delete */ if (*tree == old_item) { if left == NULL && (*tree)->right == NULL) { /* No children, unlink the node */ *tree = 0; return 1…

はじめての C

「二分木 続き 8」 int avl_insert(struct Avl **tree, struct Avl *new_item) { /* empty tree */ if (*tree == NULL) { *tree = new_item; return 1; } if (compare((*tree)->data, new_item->data) > 0) { /* Move left */ if ((*tree)->left != NULL) { …

はじめての C

「二分木 続き 7」 AVL とは、この algorithm を 生みだした 2人の 数学者 Adelson-Velsky と Landies の 2人を 意味しています。 基本となる 考え方は、それぞれの ノードの 左の分肢の 高さと、右の分肢の 高さを 比べて、その差が 必ず 1 以内に 収まるこ…

はじめての C

「二分木 続き 6」 splay木では、root への 挿入の 変更 - modification - を 利用することで、どちらの 最悪の ケースとなる 可能性も 除くように 考えられています。 必要となる 変更は 最小限ですが、一番 効果的に なるよう、挿入と 検索ルーティンの 両…

はじめての C

「二分木 続き 5」 つりあいの とれた 二分木には、代表的なものが 3つ あります。 はじめの 2つは、この tutorial で 扱うことになる spray木と AVL木です。 もう 1つの red-black木ですが、この tutorial では、簡単な 説明だけに しておきます。 でも 多…

はじめての C

「二分木 続き 4」 データが ランダム順に 挿入されるのを 保証することで、二分木は 2つの 最悪のケースと なるのを 免れます。 これが、なぜ ランダム順での 入力を 試みたのかという (理由) なのです。 しかし、もし データが ランダムでは なかったとき…

はじめての C

「二分木 続き 3」 root の ノードが あると、どうして 木の つりあいを とることが できるんでしょう ? それは、分割 - partition - という トリックに あります。 木の ノードの どれかを 選んで、それを root の ノードに できるように したい、と します…

はじめての C

「二分木 続き 2」 二分木の つりあいを とる方法では、多くの 場面で、回転 - rotation - という 操作が 必要と なってきます。 回転は、ある分肢の root を、それ自体の もつ 分肢の root の 1つと、その役割を 切り替える - switch -ときに、実行されます…

miscellanies

「議論と その前提 覚え書 (2) 1st ver.」 憲法によれば、裁判所は - その実態は ともかくとして - 三権分立の 一翼を 担っている、いわば、権力機構の 一端で あるわけだ。 そして、戦前戦後を 通じ、 civil court の 立場に 立ったことは 一度も ない。 そ…

はじめての C

「二分木 続き」 二分木 2回目の tutorial では、前に 書いたことのある、木を 変質させる- degenerate - 2つの 最悪のケースを 回避するための、さまざまな 手法を 詳しく 調べることにしましょう。 先に 学んだ アルゴリズムでは、入力時に それが 十分 ラ…

web archive

宇井純「下水処理と日本式利権構造」1997 http://www.sanseido.co.jp/booklet/nankaitusin.html#3 以前、三省堂の小冊子「ぶっくれっと」に 掲載された文章です。日本での「酸化溝」方式の 下水処理施設には、余計なモノが 相当 くっついているみたいですね…

はじめての C

「二分木 9」 これまで 見てきた 二分木では、すべて、データ構造体の テキスト内で 定義が されています。 より 多くの 制御が 必要と なったとき、例えば、下に 動くだけでなく、双方向リストと 同じように、木の 上方にも 移動させたいことが あります。 …

web archive

[住基ネット] オープンロー(a)hatena で、山根さんが 青柳武彦氏の 論文を、やんわりと 批判している。 http://openlaw.g.hatena.ne.jp/s-yamane/20050710/p2 青柳氏には - ちょっと 大げさに いえば - 歴史的な 視点が 欠けていますね。 あちらの 論文を 引…

web archive

[判決文の公開] 「下級裁主要判決情報」という web page が あります。 地裁等が、自主的に 判決文を 公開した場合、リンクして 国民に 知らせるのが その 主旨の ようです。 http://courtdomino2.courts.go.jp/kshanrei.nsf/TOP 5月末の 金沢での 住基ネッ…

はじめての C

「二分木 8」 それぞれの 走査は、stack か queue の どちらかを 使うことで、再帰を 用いることなしに、実行させることが できます。 一つの やり方として 反復版で inorder 走査を 書いてみましょう ▽ void tree_walk(struct Node *tree) { struct Node *n…

はじめての C

「二分木 7」 構築したり、二分木から 要素を 削除する 基本的な 操作は 手に入れました。 また、木に 要素が あるかどうかを 調べる コードも あります。 さて、あると 考えたものが、実際に あるのかを、はっきり 確かめる 必要が ありますよね。 それは、…

はじめての C

「二分木 6」 さてと 二分木を つくる コードも できたし、同じように、木から ノードを 削除できれば、というのは いい 考えですね。 これは より こみいった 作業です。 というのも、当てはまる ノードを 見つけた後で、処理に 3つの ケースが あるからで…

web archive

ふと 思いたって、戴震*1 のことを google で 検索していて、子欲居さんの page を 見つけた。 ただし 2001年以後 更新が 止まってるようで、リンク先の page も 削除されているところが 多い。 http://members.at.infoseek.co.jp/sumicom/ ただし、その発言…

はじめての C

「二分木 5」 木 - tree - への 挿入は、上の 検索と ほぼそのまま 同じになります。ただ 一つ 違ってるのは、null ノードが 見つかったときに、失敗時に 要求された 返り値をもつ 新しい (ノードを) 1つ 挿入することです ▽ int tree_insert(struct Node **…

はじめての C

「二分木 4」 さて、ノードを 1つ つくるための コードを 書かないといけませんね。それには、新しい ノードが 二分木へと リンクできる 必要が あります。 初めに 注意することの 一つは、木には いくつかの 検索形式を 含む、多くの 操作方法が あるという…