您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

PHP如何实现线段树

2025/11/2 21:47:05发布25次查看
线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。下面就由小编给大家分享一下php实现线段树的方法,有需要的可以参考一下。
1. 特征不一定是完全二叉树一定是平和二叉树叶子结点存储的是实际的值,非叶子结点存的是自定义的内容2. 时间复杂度操作时间复杂度
查询 o(logn)
3. 线段树的图解
4. 代码<?php/** * content: 线段树(区间树) * create: 2020-11-12 */namespace heapbundle;use arraybundle\basearray;class segmenttreeheap{ /** * 传入的数组对象 * @var basearray */ protected $array; /** * 数组 * @var array */ protected $tree = []; public function __construct(basearray $array) { $this->array = $array; $this->build(0, 0, $this->array->getsize() - 1); } /** * 构建线段树 * @param int $treeindex * @param int $min * @param int $max * @throws \exception */ public function build(int $treeindex, int $min, int $max) { // 如果线段区间的最小值和最小值相同,则表示为叶子结点 if ($min == $max) { $this->tree[$treeindex] = $this->array->get($max); return; } // 四舍五入取中间值 最大值减最小值然后除以2拿到中间值,并加上最小值 $mid = floor(($max - $min) / 2) + $min; // 获取左儿子的索引值,并递归往下构建 $leftindex = $this->leftchildindex($treeindex); $this->build($leftindex, $min, $mid); // 获取右儿子的索引值,并递归往下构建 $rightindex = $this->rightchildindex($treeindex); $this->build($rightindex, $mid + 1, $max); // 非叶子结点的值保留的是它下面所有结点的相加值, 这里可以改为它下面结点的总和值 $this->tree[$treeindex] = $this->tree[$leftindex] . '+' . $this->tree[$rightindex]; } /** * 打印线段树 */ public function vardump() { ksort($this->tree); print_r($this->tree); } /** * 获取线段树的长度 * @return int */ public function getsize(): int { return count($this->tree); } /** * 获取左儿子索引 * @param int $parentindex * @return int * @throws \exception */ public function leftchildindex(int $parentindex): int { if ($parentindex < 0) throw new \exception('父结点的索引不能小于0'); return $parentindex * 2 + 1; } /** * 获取右儿子索引 * @param int $parentindex * @return int * @throws \exception */ public function rightchildindex(int $parentindex): int { if ($parentindex < 0) throw new \exception('父结点的索引不能小于0'); return $parentindex * 2 + 2; }}
5.示例<?phprequire_once __dir__ . '/../../vendor/autoload.php';$array = new arraybundlebasearray();for ($i = 0; $i < 10; $i++) { $array->addlast($i + 10);}$heap = new heapbundlesegmenttreeheap($array);$heap->vardump();
array( [0] => 10+11+12+13+14+15+16+17+18+19 [1] => 10+11+12+13+14 [2] => 15+16+17+18+19 [3] => 10+11+12 [4] => 13+14 [5] => 15+16+17 [6] => 18+19 [7] => 10+11 [8] => 12 [9] => 13 [10] => 14 [11] => 15+16 [12] => 17 [13] => 18 [14] => 19 [15] => 10 [16] => 11 [23] => 15 [24] => 16)
推荐学习:php视频教程
以上就是php如何实现线段树的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product