バイナリヒープの子インデックス計算ツール
バイナリヒープは木構造を1本の配列に格納するため、親ノードから子ノードへ移動するには、単純ですが重要なインデックス計算が必要です。この計算ツールは、指定したノードの左の子と右の子が入る正確な配列位置を返します。プログラミング言語で一般的な0始まりと、教科書や疑似コードでよく使われる1始まりのどちらも選択できます。結果は常に決定的で、無効な根やJavaScriptの安全な整数範囲を超える演算も検証によって防ぎます。
無料で実行
式を適用する前にインデックス方式を選びます
バイナリヒープの木構造そのものは配列の番号付けによって変わりませんが、子ノードを求める式は開始位置によって異なります。0始まりでは根がインデックス0に置かれます。したがって、インデックスiにあるノードの左の子は2i + 1、右の子は2i + 2です。1始まりでは根がインデックス1に置かれるため、左の子は2i、右の子は2i + 1になります。調査する配列やアルゴリズムと同じ方式を選択してください。ノードの値を変えずに方式だけを切り替えると、実際には別の物理位置を指します。このツールは、選択した方式と元のノードインデックスを両方の結果とともに返すため、解釈が曖昧になりません。ソースコードと教科書を比較するときには特に役立ちます。多くの言語は0始まりの配列を採用していますが、学習資料では位置0を空けて、位置1からヒープを始めることがあるためです。最初に規約を確認すれば、見た目はもっともらしい1ずれの結果を避けられます。
有効なノード番号を入力して左右の位置を確認します
親ノードの整数位置を入力し、配列のインデックス方式を選択してください。0始まりのヒープでは、ノードインデックスとして0以上の安全な整数を使用できます。1始まりのヒープでは位置0が規約の外にあるため、1以上でなければなりません。応答にはleft_child_indexとright_child_indexが整数で含まれ、配列の確認、走査処理の作成、実装の検証にそのまま利用できます。ただし、これらは構造上の位置であり、実際に要素が存在することを保証する値ではありません。要素数が少ないヒープでは子が両方とも存在しない場合があり、配列末尾では左の子だけが存在する場合もあります。コードで参照する前に、返された各インデックスを実際の配列境界と比較してください。0始まりでは、子のインデックスが配列長より小さい場合にだけ存在します。1始まりでは、位置0を物理的に確保しているかによって境界条件が変わるため、ご利用のプログラムの表現に合わせて判定します。この区別により、ヒープの大きさを仮定せず、位置計算だけを正確に行えます。
ヒープ操作のテストと不具合調査に結果を活用します
子のインデックスは、sift-down、heapify、優先度付きキューからの削除、木構造の可視化に欠かせません。sift-downでは、左右の位置を計算し、存在する子を確認し、格納された優先度を比較して、ヒープ条件に違反していれば親を適切な子と交換します。インデックス方式を誤ると、本来の左の子を飛ばしたり、配列の外を読んだり、無関係な要素を比較したりします。それでも数式らしいコードに見えるため、発見が遅れることがあります。この計算ツールは、例題、単体テスト、技術課題、コードレビューで使える独立した確認手段です。根、内部ノード、ヒープ末尾付近のノードを試すと、重要な境界を効率よく確認できます。安全な整数だけを受け付け、正確な整数範囲を超える結果は拒否するため、極端に大きな入力が暗黙に丸められることもありません。ネットワーク通信、乱数、時刻依存値は使用しません。ブラウザー版とAPIハンドラーは同じ純粋関数を共有するので、同じ入力には両方で同じ出力が得られ、APIリクエスト1回の料金は$0.002です。
活用例
sift-down実装を調査する
根を削除した後、優先度付きキューが配列内の正しい2つの位置を調べているか確認できます。
教科書の式をコードへ移す
1始まりの疑似コードと0始まりの言語を比較し、1ずれの不具合を防げます。
ヒープのテストデータを作る
根、内部ノード、境界条件について、決定的なテストで期待する子の位置を作成できます。
よくある質問
0始まりではどの式を使いますか?
インデックスiのノードについて、左の子は2i + 1、右の子は2i + 2です。
1始まりではどの式を使いますか?
インデックスiのノードについて、左の子は2i、右の子は2i + 1です。
返されたインデックスなら子は必ず存在しますか?
いいえ。結果は構造上の位置です。要素を読む前に、それぞれを実際の配列境界と比較してください。
1始まりでインデックス0が無効なのはなぜですか?
1始まりのヒープでは根を位置1に置くため、この方式の位置0はノードを表しません。
APIでの計算料金はいくらですか?
APIリクエスト1回は$0.002です。同じ決定的な計算をブラウザーでも実行できます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev/heap-children-index \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"node_index":5}'const res = await fetch("https://api.kit.forhosting.com/dev/heap-children-index", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"node_index": 5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/heap-children-index",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"node_index": 5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/heap-children-index", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"node_index":5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"node_index":5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/heap-children-index", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"node_index": 5
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.heap_children_index",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |