【アルゴリズム】SortedSet(平衡二分探索木)のインデックスアクセス

平衡二分探索木には様々なアルゴリズムが開発されている。私が実装に使っているのは赤黒木なのですが(というよりそれ以外は実装したことない)、たまにインデックスアクセスしたいことがあります。

 

二分木でインデックスアクセスしようとするとO(N)の計算量(※N=要素数)かかると勘違いしている人がたまにいるのですが、O(logN)でアクセスできます。

とりあえずソートListと平衡二分探索木の特徴をまとめてみます。

 

SortedList(ソートリスト)

検索 : O(logN)

挿入 : O(N)

インデックスアクセス : O(1)

 

SortedSet(平衡二分探索木)

検索 : O(logN)

挿入 : O(logN)

インデックスアクセス : O(logN)

 

メモリ量は平衡二分探索木のほうが重いですが、挿入の比重が重く、インデックスアクセスは普段しないので、平衡二分探索木を使っとけば間違いないです。

 

そして、二分探索木でインデックスアクセスする方法ですが、

実装は各ノードに、そのノードの子孫ノードにおいて自分より小さなノードの(つまり左下ノード)総数を記憶しておくだけでいいです。

アクセスする際はルートノードから和を累積していき、累積がアクセスしたいインデックスになるようなノードを見つけるだけです。

 

ノードを回転する時、挿入or削除の際に木を辿りながら、書き換えるだけなので計算量に影響はありません。

 

C#(VB)のSortedSetですが、インデックスアクセスもサポートされていませんし、

ソートされているという特徴上、次の(大きい)ノードをO(1)で探索できるのに、前や後ろを参照する関数もサポートされていない。

また、ある値(以上、以下、よりも大きい、未満)の値を取得する関数もありません。O(logN)

 

独自で作ると非常に使いやすく、よきプログラミングライフがおくれるのでお勧めです。

 

 

【WPF】Stringやintなどのシステム型をXamlで直接生成する。

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:sys="clr-namespace:System;assembly=mscorlib"
   x:Class="hogehoge"
    Title="test" Width="100" Height="100">
 
  <ListBox Margin="10">
    <ListBox.ItemsSource>
      <x:Array Type ="{x:Type sys:String}">
        <sys:String>foo</sys:String>
        <sys:String>bar</sys:String>   
      </x:Array>
    </ListBox.ItemsSource>
  </ListBox>
</Window>

 

とすれば簡単に生成できる、よく質問される。

詰まるポイントとしては

  • xmlnsでsysと生成している部分のasseemblyを指定していないか、Systemが設定されている。インテリジェンスを使うとよく起こる。ちゃんとmscorlibを設定しよう。
  • x:Array、sys:Stringはインテリジェンス候補として表示されない。全て手動で入力しないといけない。
  • x:ArrayのTypeを設定したり、全てのコンテンツを入力しないと不適当なエラーが表示される。

つまり、エラーやインテリジェンスに惑わされない事が必要。正常なコードでもビルドするまでエラーが消えないことがよくあるので、WPFにおいてはVIsualStudioをあんまり信用しちゃいけませんよって事。

 

私もBlend使い始めた時は、何度も騙されました(笑)

【WPF】Blend for Visualstudio 2015 で階層構造と名前空間の違うコードは読み込まれないバグ

Blend for Visualstudio 2015を使っていて、プロジェクト上のコードファイルの物理的階層構造と、その名前空間が一致しない時コンパイラが認識しない。

 

例えば、exsample.test 名前空間に存在するオブジェクトはexsampleプロジェクトのtestフォルダ上にコードを配置しないとエラーを吐く。

今まではこんなことなかったはずなのに、Blend2015はなんかおかしい気がする。

 

【WPF】Toolkitが導入できない件

本家本元WPFToolkitは既にサポートが切れているらしく、最終リリースは2010年らしい。

皆使ってるだろうからこれでいいかーってNugetしたらChart系のコントロールが見当たらない。

そんな馬鹿なって今度は公式からインストーラーをダウンロードしてインストールしても全然ダメ。

調べたら、NET.Framework3.5しかサポートされていないらしい。

仕方ないのでコードを入手して自分で設定弄ってやってコンパイルしようとしたが、今度はMicrosoft.Windows.Design.dllが参照できないし。OSにスキャンかけてやっても見つからない。多分古いバージョンではないと存在しないのだろう。

 

ここまでして本家は断念。皆どうやって使っているんだろう。

 

次は、Nugetで上位に来ていたExtendWPFToolkitを使用してみることに、Codeplexでドキュメントを翻訳しながら読んでいると、Chart系はまさかの有料。

諦めて今までどおりカスタムコントロールで自作しようと、簡易円グラフ作ったけど非常に時間がかかった。この調子でライブラリを作っていくと相当に時間がかかる。

 

適当にネットサーフィンしていたらSparrow Toolkitを発見。少し使ってみたが問題なく使えた。今までの苦労に涙を流しながら、これからはこれを使おうと思う。