java实现VEBTree原型

本文将详细介绍如何使用Java实现VEBTree数据结构,该过程耗费了一周的时间,目前只完成了构建部分,后续会补充删除操作的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

花了一周时间才想明白,稍后补上删除代码

package tree;

import java.lang.reflect.Array;

@SuppressWarnings("unchecked")
public class ProtoVEBTree {

    public Node root;

    public ProtoVEBTree(int length) {
        this.root = new Node(length);
    }

    public static class Node {
        protected int u;
        protected Object[] nodeArray;
        protected Node summary;

        /*
        Node的构造方法顺带初始化protoVEBTree
         */
        protected Node(int u) {
            this.u = u;
            if (u == 2) {
                this.summary = null;
                this.nodeArray = new Object[2];
                this.nodeArray[0] = this.nodeArray[1] = 0;
            } else {
                int childSize = (int) (Math.sqrt(u));
                this.nodeArray = (Object[]) (Array.newInstance(Node.class, childSize));
                for (int i = 0; i < this.nodeArray.length; i++)
                    this.nodeArray[i] = new Node(childSize);
                this.summary = new Node(childSize);
            }
        }

        protected int contain(int i) {
            if (u == 2)
                return (Integer) (this.nodeArray[i]);
            else
                return ((Node) (this.nodeArray[i / this.nodeArray.length])).contain(i % this.nodeArray.length);
        }

        protected Integer minNum() {
            if (u == 2)
                if ((Byte) (nodeArray[0]) == 1)
                    return 0;
                else if ((Byte) (nodeArray[1]) == 1)
                    return 1;
                else
                    return null;
            else {
                Integer minCluster = summary.minNum();//找出最小元素所在的簇号
                if (minCluster == null)
                    return null;
                else {
                    int offset = ((Node) (nodeArray[minCluster])).minNum();
                    return minCluster * nodeArray.length + offset;
                }
            }
        }

        public Integer successor(int x) {
            if (u == 2)
                if (x == 0 && ((Byte) (nodeArray[1])) == 1)
                    return 1;
                else
                    return null;
            else {
                int highx = x / nodeArray.length;
                Integer offset = ((Node) nodeArray[highx]).successor(x % nodeArray.length);//先假定next和x在同一簇,求得next的偏移值
                if (offset != null)
                    return highx * nodeArray.length + offset;
                else {//如果不在同一簇,先求出x所在簇的下一簇的簇号,然后求得下一簇的最小值
                    Integer successorCluster = summary.successor(highx);
                    return successorCluster == null ? null : successorCluster * nodeArray.length + ((Node) nodeArray[successorCluster]).minNum();
                }
            }
        }

        public void insert(int x) {
           if(u==2)
               nodeArray[x]=1;
            else{
               ((Node)(nodeArray[x/u])).insert(x%u);
               summary.insert(x/u);
           }
        }
    }

    public int contain(int i) {
        return this.root.contain(i);
    }

    public Integer minNum() {
        return this.root.minNum();
    }

    public Integer successor(int x) {
        return this.root.successor(x);
    }

    public void insert(int x) {
        root.insert(x);
    }

    public static void main(String[] args) {
        Node s = new Node(16);
        System.out.println("ok");
    }


}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值