VBSで便利なプログラムを作れスレ 2 (853レス)
1-
抽出解除 レス栞

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
333
(21): デフォルトの名無しさん [sage] 2019/02/20(水)02:40 ID:B2QSVSiS(1/5)
>>321
すべてのノードについて、左の子以下の数は、自分の数よりも小さく、
右の子以下の数は、自分の数よりも大きくなる

これは普通の2分探索木で、
C++ のSTL にある、map・set というコンテナだろ

でも皆、再帰を使って実装しているのでは?
再帰を使わない方法は、思いつかない
336: デフォルトの名無しさん [] 2019/02/20(水)04:50 ID:DVhbz9AC(2/4)
>>333-334
前回は片山のおかげで台無しだったもんな
いつもの自演乙
342
(2): ピッコロ ◆YAZTByPXwc6o [] 2019/02/20(水)21:39 ID:zpD+5nAC(1/3)
>>333
   ∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧∧
 <STL!STL!STL!STL!STL!STL!STL!STL!STL! >
  ∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨∨
    、        、        、       、        、
  /っノ      /っノ      /っノ     /っノ      /っノ
 / /  ∧_∧ / /  ∧_∧ / /  ∧_∧ / /  ∧_∧ / /  ∧_∧
 \\(    )\\(    )\\(    )\\(    )\\(    )
345: ピッコロ ◆YAZTByPXwc6o [] 2019/02/20(水)22:20 ID:zpD+5nAC(3/3)
>>333
STLでググりましたけどわけわからなすぎてむりぽ
二分探索木を実装したいんじゃないんです
二分木を数字の順番でたどって値を出力したいんです
どうかよろしくお願いいたします
346
(1): 333 [sage] 2019/02/20(水)23:54 ID:B2QSVSiS(5/5)
二分木
https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%9C%A8

行きがけ順、通りがけ順、帰りがけ順探索[編集]

二分木においてはあるノードとその子孫もまた二分木を構成する。これを部分木と呼ぶ。
従って二分木を部分木に分け、再帰を用いて探索する方法は自然である。

根を調べてからそれにぶらさがる部分木を調べるのが行きがけ順 (preorder)、
部分木を調べてからその根を調べるのが帰りがけ順 (postorder) 、
片方の部分木を調べ、根を調べ、次いで反対の部分木を調べるのが通りがけ順 (in-order) である。

二分探索木では通りがけ順探索は、ノードを大きさ順(あるいは大きさの逆順)に調べることになる。

>>321
は、通りがけ順でしょ

ところで、ピラフ大王は、ピッコロ大魔王になったのですか?
348
(1): 333 [sage] 2019/02/21(木)00:07 ID:JBRYA9bz(1/4)
通りがけ順は、左の子がある限り、ドンドン降りていく

左の子から上に上がったら、そのノードを記録して、右の子へ降りる

右の子へ降りたら、また左の子がある限り、ドンドン降りていく
350
(3): 333 [sage] 2019/02/21(木)00:10 ID:JBRYA9bz(2/4)
それを再帰を使わずに実装していることなんて、あるかな?
漏れは、思いつかない

アルゴリズムのスレで聞いたら、どうかな?
354: 333 [sage] 2019/02/21(木)08:40 ID:JBRYA9bz(3/4)
順位キュー(優先度付きキュー、priority queue)は、ダイクストラ・A* で使っている。
確か、2分ヒープと同じで、最小値だけがtop に来る。
他のノードの関係は、保証されないのだったかな?

>>321
の図で説明すると、

まず、4に来るとキューに、[4, 2, 6] を追加すると、[2, 4, 6]となる

削除しないで、peek だけすると、最小は2なので、2へ行き、[1, 3] を追加すると、[1, 2, 4, 6, 3]となる

そこでpeekすると、最小は1なので、1へ行き、追加するものはないので、
1をpop して、peekすると、最小は2なので、2へ戻り、
2をpopして、peekすると、最小は3なので、3へ行き、追加するものはないので、
3をpopして、peekすると、最小は4なので、4へ戻り、追加するものはないので、
4をpopして、peekすると、最小は6なので、6へ行き、[5, 7] を追加すると、[5, 6, 7]となる

そこでpeekすると、最小は5なので、5へ行き、追加するものはないので、
5をpopして、peekすると、最小は6なので、6へ戻り、
6をpopして、peekすると、最小は7なので、7へ行き、追加するものはないので、
7をpopすると、キューが空

プログラミング・コンテスト・チャレンジブック、第2版、2012

言語は、C++で、ほとんど全てのアルゴリズムを網羅。
問題数も多く、パズル感覚で楽しめる。
AIやシミュレーションゲームの参考になる
355
(1): 333 [sage] 2019/02/21(木)08:56 ID:JBRYA9bz(4/4)
2分ヒープ(BinaryHeap)は、
優先度つきキュー (順位キュー、priority queue)や、
ダイクストラ法 (Dijkstra's Algorithm)で使っているけど、

ここで、JavaScript の配列を使って、2分ヒープを作っている。
http://jsdo.it/michihito/bGH5

PushObj, PopObj を見たけど、再帰は使っていない!
追加・削除の計算量はともに、O(log n) です

確か以前も、このスレで、このアルゴリズムに改良点があるとか、ピラフに指摘されたはず
359
(1): 333 [sage] 2019/02/22(金)06:28 ID:43iXBVf1(1/2)
順位キューではなく、スタックで考えてみた

>>321
の図で説明すると、

まず、4に来ると、スタックに大きい方から、[6, 4, 2] をpush する

削除しないで、末尾をpeek だけすると、最小は2なので、2へ行き、
一旦、2をpop してから、[3, 2, 1] をpushすると、[6, 4, 3, 2, 1]となる。
(一旦、2をpopして、順番を変えるのがミソ)

そこでpeekすると、最小は1なので、1へ行き、追加するものはないので、
1をpop して、peekすると、最小は2なので、2へ戻り、
2をpopして、peekすると、最小は3なので、3へ行き、追加するものはないので、
3をpopして、peekすると、最小は4なので、4へ戻り、追加するものはないので、
4をpopして、peekすると、最小は6なので、6へ行き、
一旦、6をpop してから、[7, 6, 5] をpushすると、[7, 6, 5]となる

そこでpeekすると、最小は5なので、5へ行き、追加するものはないので、
5をpopして、peekすると、最小は6なので、6へ戻り、
6をpopして、peekすると、最小は7なので、7へ行き、追加するものはないので、
7をpopすると、スタックが空
362
(1): 333 [sage] 2019/02/22(金)11:33 ID:43iXBVf1(2/2)
>>360
順位キュー・スタックの、どちらで実装できたの?

漏れも、Ruby, JavaScript, Haxe あたりで書いてみようかな?
365
(1): 333 [sage] 2019/02/23(土)08:10 ID:DQY5g4De(1)
良ければ、どこかで発表してください

漏れも、参考にしたいので
369
(1): 333 [] 2019/03/15(金)15:40 ID:L+hp7qbL(1)
>>366
これを解析して、Ruby に変換しようとしているけど、キツイw
389: 333 [sage] 2019/03/16(土)22:17 ID:1E15fsAJ(1)
>>370-371
ピッコロ様、ありがとう。参考にします

今、rubytree gem を使えるのか、説明書を読んでいるところです
390
(1): 333 [sage] 2019/03/17(日)05:15 ID:QeX4wN+m(1/4)
他にも、ruby_structures というgem もあるようです

Stack, Queue, Linked List, Binary Tree, LRU Cache, Heap, Priority Queue, Graph and Weighted Graph など、
1人でアルゴリズムの部品を作っているようです

色々と、研究してみます

しかし、ピッコロの成長力は、すごいですね!
もう漏れは、軽く抜かれていますわw
391
(1): 333 [sage] 2019/03/17(日)08:07 ID:QeX4wN+m(2/4)
>>370
accessor で、インスタンス変数の読み書きを公開できます。
それと、多重代入も使えます。
inspect も再定義しておけば、p の表示をカスタマイズできます

class Tree
attr_accessor :value, :left, :right

def initialize(value, left, right)
@value, @left, @right = value, left, right
end

def inspect( ) "#{ @value } : #{ @left ? @left.value : nil } : #{ @right ? @right.value : nil }" end
end

また、class を、module で囲むのもおすすめ

module BinaryTree
class BinaryTreeNode
end
end
392
(1): 333 [sage] 2019/03/17(日)08:16 ID:QeX4wN+m(3/4)
それと、parent もあっても良いかも

def initialize(val=nil, parent=nil, left_child=nil, right_child=nil)
end
396
(1): 333 [sage] 2019/03/17(日)22:12 ID:QeX4wN+m(4/4)
この2分木は、同じ値が複数存在しないことが前提条件ですか?

複数あると、バグるのでしょうか?
401
(3): 333 [sage] 2019/03/18(月)22:38 ID:e1XJ4IHa(1/3)
平衡2分木は基本だね

インデックスに対して、MongoDBはB Treeを採用し、MySQLのInnoDBはB+ Treeを採用しているらしいし、
Linux のプロセス・スケジューラーは、赤黒木を使っている

B TreeとB+ Treeの違い
https://christina04.hatenablog.com/entry/2017/05/17/190000
402: 333 [sage] 2019/03/18(月)22:47 ID:e1XJ4IHa(2/3)
>>401
では、全データを走査するには、B Tree よりも、B+ Tree の方が良さそう。
ただし、メモリを2倍ぐらい使いそう

それと、逆順の走査には、next pointer を双方向ポインターにする方が良さそう
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.028s