四叉树初步研究

2023-11-14

【JS】 四叉树初步研究

  • 四叉树 为何要叫四叉树,二叉树与八叉树又是生么东东,看样子理解起来比较困难,实现该如何入手?
  • 树 就是树的结构,树根、树干、树枝、树叶、…还有好吃的果实。o( ̄▽ ̄)ブ 其实树这种结构,很常见的,JSON 不就是最普通的树吗?
  • 四叉树的说明我就不写了,毕竟别人早就写过了,很多很多,看多了晕,还不如找个权威的动手写。四叉树是 空间位置属性划分 的方式。

普通JSON 平常见到的最多的数据结构,相对四叉树来说就是一叉树,这样好懂不

// 最外面这个就是 Root 节点
// 总是有一个节点装下所有节点,包括他自己(tree.root = this)
 var tree = {
	value:"xxx",
	children:[{
		value:"xxx2",
		children:[...]
	},{
		value:"xxx4",
		children:[{
			value:"xxx5",
			children:[...]
		}]
	}, ...]
}

上面代码写接口的人最常见了,来看下面四叉树的节点定义

四叉树节点关系

注意,这是分支节点,并不是传统的数据节点,他们分别在两个不同的属性上,且分支节点是固定的 (四叉树就是四个,二叉树是两个)
再看看下面的 空间定义,分四个象限区域,每个区域都有自己的空间属性等

在这里插入图片描述

四叉树的模型就这些,其实不难,重在设计,下面来看看,代码的设计方面
ES3 ES5 JS 代码在非 ES6 或更高时 代码设计成型后,对于理解和梳理并不是最好的,先看看普通写法实例

// 四叉树的一般结构
var ForkTree = {
	state:true,
	level:1,
	left:0,top:0,right:1360,bottom:660,
	dataList:[ Shape ], // 数据节点 一般存放带有位置属性的 对象
	nodeList:[{...},{...},{...},{
		state:false,
		level:2,
		left:680,top:330,right:1360,bottom:660,
		dataList:[ Shape ],
		nodeList:[{...},{...},{...},{...}],
		//... 四叉树是四个节点 每个节点又可以继续分裂,如此往复
	}]
}
function insert( object , node ){
	// 插入到节点中
	// 这里经行 插入条件判断
}
function create( left , top ,right , bottom , level){
	// 创建一个新的空白 节点
	// 其他属性
	// parent 
	// maxcount 
}

// 其他方法
// function split(){}
// function delete( object ) {}
// function getFullNode( object , node) {}

这样写下来 看的懂,也需要自己多多练习,朝着自己需要的地方优化,简化,如果换成 ES6 的写法 ,可能会更好理解四叉树的创建过程。

class ForkTree {
	constructor(left , top , right , bottom , level){
		// 记录空间位置属性等
		this.level = level;
		this.width = right - left;
		this.height = bottom - top;
		// ...
	}
	insert(){} // 插入判断
	split(){} // 分裂 创建自己的 四个象限节点
	parent(){} 
	addShape(shape){}
	delShape(shape){}
	// ... 还有其他的一些扩展 属性 和 方法
}

嗯,看样子这样写 确实好多了,只是写到后面,方法属性都堆积在一起,工具方法也好,测量方法也好,都会增加维护和排查问题的难度
考虑到 Root 节点只有一个,且大部分插入的时候都是从第一个节点开始遍历整棵树,所以由一个 来当 Root 节点 用另一个 来表示非 Root 节点 ,更多的还可以继续将功能分类,分到不同的类中。
我的设计是把 容器和控制 尽量分开,继续看

// 控制 和 容器分离
// 普通节点
class Region {
	constructor(left , top , right , bottom , level){
		// 数据存储记录
	}
	
	parent(){}
	split(){} 
	add(shape){} 
	remove(shape){}
	isCline(l,t,r,b){} // 检查不在当前节点的中线上 
}

// Root节点 
class Tree extends Region{
	//拥有普通节点所有的功能
	constructor(width , height , maxlevel){
		super(0 , 0 , width , height , 1);
		// 初始化 Root 节点独有的一些属性
		this.maxLevel = maxlevel?maxlevel:4;
		// ...
		this.initSplit();
	}
	isLower(region){ // 是否到达最大分裂深度
		return region.level >= this.maxLevel ;
	}
	insert( shape ,region){
		if (!region) region = this;
		if (region.isCline(shape.l, shape.t, shape.r, shape.b)) return region;
		if(!region.isSplit){
			...// 如果深度到达上限 就返回 这个节点
			...// 如果当前容器内 数据长度没有突破上限 就返回这个节点
            region.isSplit = true;// 表示当前节点的子节点可要 
            // 移动数据到合适的子节点中 
            let mylist = region.list;
            region.list = [];
            for (let cur of mylist) {
                this.insert(cur).add(cur);
            }
		}
		//根据位置获取 子 域 判断是否在 子 域中线上 否则 插入
		// I II III IV 
        let vcenline = region.left + region.cenWidth;
        let hcenline = region.ttop + region.cenHeight;
        if (vcenline > shape.right) { // node 节点具体存储在那个属性中自己定义
            if (hcenline > shape.bottom) { 	// lt II
                return this.insert(shape, region.node[1]);
            } else { 					// lb III
                return this.insert(shape, region.node[2]);
            }
        } else {
            if (hcenline > shape.bottom) { 	// rt I
                return this.insert(shape, region.node[0]);
            } else { 					// rb IV
                return this.insert(shape, region.node[3]);
            }
        }
	} 
	
	this.initSplit(region){ // 初始化整棵树的节点
		if(this.isLower(region))  return; //停止分裂
		for(let item of region.node) item .split();
	}
}

功能这样分开后,普通节点就主要做好数据存储,一些简单的方法接口等,其他高级的插入,查询,维护等功能都放在 Tree 类中。
像工具方法(位置计算,密度技术等)可以写成新的类,或者写成静态方法,这样语意会更加清晰易懂,便于维护扩展。
上面代码仅供参考,已经有现成的,可供后续深入研究,基本可以跑,会省去很多事情,请看后续的 demo 代码
自定义链表 + 自定义四叉树 初步实现,链表可使用 for of 循环
Chain.JS 自定义链表 此链表设计方向是 多个链表之间的数据移动,而不是数据复制

"use strict";
// 链定义
class Chain {
    constructor() {
        this.lower = new Clasp("end");
        this.top = new Clasp("start");
        this.top.setNext(this.lower);
        this.top.setPacks(this);
        this.lower.setLast(this.top);
        this.lower.setPacks(this);
        this.current = this.lower;
        this.length = 0;

        //遍历链表节点
        this.item = {
            root:this,
            current:this.lower,
            [Symbol.iterator]() {
                this.current = this.root.top.next;
                return this;
            },
            next:function(){
                if (!this.current.done) {
                    let node = this.current;
                    this.current = node.next;
                    return {done: false , value : node};
                } else return {done: true};
            }
        }
    }

    ///Symbol.iterator for of 接口实现

    //遍历链表值
    [Symbol.iterator]() {
        this.current = this.top.next;
        return this;
    }

    next() {
        if (!this.current.done) {
            let node = this.current;
            this.current = node.next;
            return node;
        } else  return {done: true};//循环结束
    }

    return() {
        //循环终止
        return {done: true};
    }

    ///

    add(clasp) {
        if (clasp.packs) {
            if (clasp.packs === this) return;
            clasp.packs.remove(clasp);
        }
        let last = this.lower.last;
        last.setNext(clasp);
        this.lower.setLast(clasp);
        clasp.setNext(this.lower);
        clasp.setLast(last);
        clasp.setPacks(this);
        clasp.done = false;
        this.length++;
    }

    remove(clasp) {
        if (clasp.packs === this) {
            let last = clasp.last;
            let next = clasp.next;
            last.setNext(next);
            next.setLast(last);
            clasp.packs = null;
            this.length--;
        }
    }

    push(val) {
        let node = new Clasp(val);
        this.add(node);
        return node;
    }

    join(chain){
        let totop = this.top.next;
        let tolower =  this.lower.last;

        let intop = chain.top.next;
        let inlower = chain.lower.last;
        let inlength = chain.length;

        this.lower.last = inlower;
        inlower.next = this.lower;
        intop.last = tolower;
        tolower.next = intop;

        chain.top.next = chain.lower;
        chain.lower.last = chain.top;
        chain.length = 0;

        this.length += inlength;

        let cur = intop;
        while(!cur.done){
            cur.packs = this;
            cur = cur.next;
        }
    }

    clear() { // 后续扩展
    }
}

// 节点定义
class Clasp {
    constructor(val) {
        this.done = true;
        this.value = null;
        this.packs = null;
        this.next = null;
        this.last = null;
        if (val) this.value = val;
    }


    delete() {
        if (this.packs) this.packs.remove(this);
    }

    setNext(clasp) {
        this.next = clasp;
    }

    setLast(clasp) {
        this.last = clasp;
    }

    getValue (){
        return this.value;
    }

    setValue (val){
        this.value = val;
    }

    setPacks(chain) { //表示节点在那个链中
        this.packs = chain;
    }
}

Tree.JS 自定义四叉树 此四叉树设计方向是 尽量简单 简化,拥有列表的加持,对数据在各个树节点中移动的速度比平常数组要好

"use strict";
// 树节点
class Region {
    constructor(l, t, r, b, level) {
        let w = r - l,
            h = b - t;
        this.l = l;
        this.t = t;
        this.r = r;
        this.b = b;
        this.w = w;
        this.h = h;
        this.cw = w / 2;
        this.ch = h / 2;
        this.level = level;

        this.splited = false;
        this.edged = false;


        this.nodeRT = null;// Region
        this.nodeLT = null;// Region
        this.nodeLB = null;// Region
        this.nodeRB = null;// Region

        this.tree = null;
        this.parent = null;

        // Chain.js
        this.list = new Chain();
    }

    getLevel() {
        return this.level;
    }


    setParent(parent) {
        this.parent = parent;
        return this;
    }

    getParent() {
        return this.parent;
    }
	// 设置 树的 Root 节点 并初始化一些参数 
    setTree(tree) {
        this.tree = tree;
        this.edge = this.l === 0 || this.t === 0 || this.r === this.tree.r || this.b === this.tree.b;
        this.limit = this.tree.limit * Math.pow(0.667, this.level);
        this.wedge = this.limit / 2;
        // level 深度 插入当前节点引用 // 广度优先 准备的属性
        this.tree.key.get(this.level).push(this); 
        return this;
    }

    getTree() {
        return this.tree;
    }

    topLimit() {
        return this.limit + this.wedge <= this.list.length;
    }

    lowerLimit() {
        return this.limit - this.wedge >= this.list.length;
    }


    /** 中线上
     * @method
     * @param {number} l
     * @param {number} t
     * @param {number} r
     * @param {number} b
     * */
    isCline(l, t, r, b) {
        return ((this.l + this.cw) > l && (this.l + this.cw) < r) || ((this.t + this.ch) > t && (this.t + this.ch) < b);
    }

    /** 可容纳
     * @method
     * @param {number} l
     * @param {number} t
     * @param {number} r
     * @param {number} b
     * */
    isInto(l, t, r, b) {
        return this.l < l && this.t < t && this.r > r && this.b > b;
    }

    /** 是边缘域 > 不考录是否可容纳 但考虑是否在中线 */
    isEdge() {
        return this.edged;
    }

    /** 是否分裂 */
    isSplit() {
        return this.splited;
    }

    setSplit(issplit) {
        this.splited = issplit;
    }

    split() {
        let nlevel = this.level + 1;

        //树节点
        this.nodeRT = new Region(this.l + this.cw, this.t, this.r, this.t + this.ch, nlevel).setTree(this.tree).setParent(this);
        this.nodeLT = new Region(this.l, this.t, this.l + this.cw, this.t + this.ch, nlevel).setTree(this.tree).setParent(this);
        this.nodeLB = new Region(this.l, this.t + this.ch, this.l + this.cw, this.b, nlevel).setTree(this.tree).setParent(this);
        this.nodeRB = new Region(this.l + this.cw, this.t + this.ch, this.r, this.b, nlevel).setTree(this.tree).setParent(this);

    }

	// 插入
    addTo(clasp) {
        //此操作 会转移 节点
        this.list.add(clasp);
    }
	// 移除
    removeTo(clasp) {
        this.list.remove(clasp);
    }
}

// 树 Root 节点 同样是 主要控制器
class Tree extends Region {
    constructor(w, h, level) {
        super(0, 0, w, h, 1);

        this.maxLevel = level ? level : 4;// 默认 4
        this.limit = 108 * 1.5; //值实际为 * 0.667

        this.key = new Map();// get set has delete
        let i=1;
        while(i<=this.maxLevel){
            this.key.set(i,new Chain());
            i++;
        }

        this.setTree(this);
        this.splitTo(this);
        this.setSplit(true);
    }

    isLower(region) {
        return region.level >= this.maxLevel;
    }

    addShape(shape) {
        let item = new Clasp(shape);
        this.key.set(shape, {
            clasp: item,
            region: this
        });
        this.addItem(item);
    }
	// 插入数据 item 为链表的一个节点引用
    addItem(item) {
        let shape = item.value;
        let keyobj = this.key.get(shape);
        keyobj.region = this.inRegion(shape, this); //移动后的新 region
        keyobj.region.addTo(item);
    }

    delShape(shape) {
        let keyobj = this.key.get(shape);
        keyobj.region.removeTo(keyobj.clasp);
        this.key.delete(shape);
    }

	// 删除数据 item 为链表的一个节点引用
    delItem(item) {
        let keyobj = this.key.get(item.value);
        keyobj.region.removeTo(keyobj.clasp);
        this.key.delete(item.value);
    }

	// 获取符合条件的 树节点 
    inRegion(shape, region) {
        // 获取图形可插入的 最深 region
        // 最坏的情况是 tree 节点
        if (!region) region = this;
        if (region.isCline(shape.l, shape.t, shape.r, shape.b)) return region;

        if (!region.isSplit()) {
            if (this.isLower(region)) return region;
            if (!region.topLimit()) return region;
            region.setSplit(true);

            // 复制 // 移动元素
            let mylist = region.list;
            region.list = new Chain();
            for (let cur of mylist.node) {
                this.inRegion(cur.value).addTo(cur);
            }
        }

        //根据位置获取 子 域 判断是否在 子 域中线上 否则 插入 
		// II III || I IV
        let vcenline = region.l + region.cw;
        let hcenline = region.t + region.ch;
        if (vcenline > shape.r) { 		
            if (hcenline > shape.b) { 	// lt II
                return this.inRegion(shape, region.nodeLT);
            } else { 					// lb III
                return this.inRegion(shape, region.nodeLB);
            }
        } else {
            if (hcenline > shape.b) { 	// rt I
                return this.inRegion(shape, region.nodeRT);
            } else { 					// rb IV
                return this.inRegion(shape, region.nodeRB);
            }
        }
    }

	// 当节点中 数量 小于一定值时 将数据存放在父级节点中
    mergeTo(region) {
        if (region.splited) {
            if (region.limit - region.wedge
                > region.nodeRT.list.length
                + region.nodeLT.list.length
                + region.nodeLB.list.length
                + region.nodeRB.list.length
            ) {
                region.setSplit(false);
                region.list.join(region.nodeRT.list);
                region.list.join(region.nodeLT.list);
                region.list.join(region.nodeLB.list);
                region.list.join(region.nodeRB.list);
            }
        }
    }

	// 初始化树节点
    splitTo(region) {
        if (this.isLower(region)) return;
        region.split();
        this.splitTo(region.nodeRT);
        this.splitTo(region.nodeLT);
        this.splitTo(region.nodeLB);
        this.splitTo(region.nodeRB);
    }
}

代码中出现的 shape 是图形的基础类,拥有:x y 属性以及四个边的属性(俗称包围盒 AABB ):l t r b 。
到此 四叉树的研究已近结束 其他疑问或意见可以通过邮箱发送
如有误导请联系,我会进行修正。
邮箱 hbck_gwx@qq.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

四叉树初步研究 的相关文章

  • 将 HTML 表格结构复制到剪贴板

    我只是在寻找这方面的建议 我一直在互联网上寻找可能的解决方案 了解如何将 HTML 表格结构及其文本复制到剪贴板 但到目前为止还没有那么幸运 我现在拥有的是一个包含数据的简单表格 用户需要在复制 粘贴时使用 Outlook 将其复制到电子邮
  • $(window).resize() 和打印预览模式

    我有一段非常简单的代码 可以在调整大小后刷新窗口 window resize function location reload 当我尝试在 Chrome 中打开打印预览模式 Ctrl P 时 它也会刷新它 有什么想法如何避免这种行为吗 要确
  • ngRepeat 中的函数执行过于频繁

    我有三个tabs里面有不同的htmlng include 这些选项卡使用以下方式显示ng repeat 只有一个 HTML 模板包含函数调用 但它执行了 3 次 每个模板执行一次 ng repeat迭代 这里出了什么问题以及如何解决它 va
  • Xhr上传event.loaded问题

    opts xhr function var xhr new window XMLHttpRequest Upload progress xhr upload onprogress function e if e lengthComputab
  • 如何从客户端设置 HTMLEditorExtender HTML

    我无法让它工作 这是我在另一个线程中找到的代码 但它对我不起作用 我得到 set content 不是函数 find set content whatever 这仍然有效吗 我还尝试设置它扩展的文本框的值 尝试设置两者的 InnerHtml
  • 在复选框内映射复选框 ReactJS

    我有一个函数 一旦主复选框被选中 就会触发子复选框 并且所有这些复选框都是从 JSON 映射的 主复选框 最高级别 及其下面的所有子复选框 第二级别 都会在单击时显示 并且效果很好 我想要显示的是单击时主复选框 第三级别 的子复选框2 级项
  • Javascript - window.getCompulatedStyle 返回“auto”作为元素顶部和左侧属性

    在我的网页上 我有一些元素 div 子 div 按钮等 其位置是相对于它们所在的 div 以及彼此之间生成的 这会导致使用时的结果window getCompatedStyle the top and left属性不是数字值 而是简单的 a
  • jQuery的$如何既是函数又是对象?

    我的意思是对象 object Object 它是怎么做的 selector and fn init同时 你能给我一个简单的例子吗 这并不是 jQuery 独有的 而是 javascript 的一个方面 所有函数都是对象 例如 var f f
  • 如何使用 Angularjs 检查模块中的指令或控制器是否可用

    在 angularjs 中 给定一个模块 如何检查给定一个模块是否存在指令 控制器 我有一个模块 我想知道是否已加载某些特定指令 下面是一些示例代码 var module angular module myModule check if c
  • 在 TypeScript 中迭代对象的键和值

    在纯 JavaScript 中 我们可以迭代对象属性和值 如下所示 const values Object keys obj map key gt obj key 在 TypeScript 中 此语法是错误的 因为 TS 编译器显示以下消息
  • 在 JavaScript 中对数组进行排序

    我正在尝试对内部包含整数的数组进行排序 例如 var array 123 3 745 4 643 5 643 2 我如何对其进行排序才能返回类似以下内容的内容 array 745 4 643 2 643 5 123 3 您可以将自定义比较函
  • 如何在点击时添加和删除活动类 - 角度方式

    我正在这样做 div class tiles div 控制器 scope select function item scope selected item scope isActive function item return scope
  • 指令可以从父作用域中删除自身吗

    假设我有以下代码 div div div div 我的自定义指令有一个独立的范围 定义为 app directive customDirective function log return restrict E templateUrl te
  • 为什么我会失去对元素的引用?

    我偶然发现了一些奇怪的东西 至少对我来说 案例如下 我选择一个元素 child1 从 DOM 并将其保存到变量中 我继续添加一个新元素child1的家长 parent1 现在 如果我尝试修改某些值child1它不记录更改 似乎引用已经消失
  • React:在哪里扩展对象原型

    我使用创建了一个纯 React 应用程序创建反应应用程序 https github com facebookincubator create react app 我想延长String类并在一个或多个组件中使用它 例如 String prot
  • 在单页应用程序上重用 Google Maps API 实例

    假设我有一个单页应用程序 Angular JS 应用程序 并且我在元素 id 上绘制一个 Google 地图实例googleMap var mapInstance new google maps Map document getElemen
  • React:设置 State 或设置 Prop 而无需重新渲染

    Problem 目前 我有一个LoginForm具有 成功 处理函数的组件handleOnSuccess 然后将其链接到父组件onTokenUpdate由 令牌更新 处理函数定义的属性handleUpdateToken 问题是setStat
  • HighCharts - 两个 Y 轴,一个具有最大值

    我在使用 Highcharts 时遇到问题 我已将右 Y 轴设置为 min 0 和 max 100 它是 但它不起作用并生成 125 百分比 怎么了 http jsfiddle net SdTcU http jsfiddle net SdT
  • ajaxStart 和 ajaxStop 与 fetch API 等效

    我正在尝试将 API 调用从使用 jQuery ajax 迁移到使用 Fetch API 我使用 jQuery ajaxStart 和 ajaxStop 在服务器调用期间显示加载旋转器 我正在运行多个并行服务器请求 我希望旋转器在第一个请求
  • 如何将所有后代节点和链接设置为与 2 级祖先相同的颜色?

    我有一个 d3 js 树 其后代节点接收其 2 级祖先的节点颜色 这在级别 2 到级别 3 之间有效 但在级别 4 及以上级别停止工作 相关代码 var colourScale d3 scale ordinal domain MD Prof

随机推荐

  • Java垃圾回收(GC)机制

    一 为什么要垃圾回收 如果不进行垃圾回收 内存迟早都会被消耗空 因为我们在不断的分配内存空间而不进行回收 除非内存无限大 我们可以任性的分配而不回收 但是事实并非如此 所以 垃圾回收是必须的 哪些内存需要回收 哪些内存需要回收是垃圾回收机制
  • 亲密关系-【沟通日志】-如何不再重蹈覆辙

    大多数人会问 我要怎么克服眼前的困难 实际上应该问 哪些事已经做得很好 学会记录成长 就能固定成长 自我激励 过去的成功 会激发未来的成功 意识到自己已经走了多远 你才会更愿意继续去坚持 记录成长的工具 沟通日志 日期 年 日 每日记录 1
  • 2.Python数据分析项目——旅游景点票价预测

    1 总结 流程 具体操作 基本查看 查看缺失值 查看数值类型 预处理 缺失值处理 填充 拆分数据 获取有需要的值 统一数据格式 数据分析 groupby分组求最值数据 seaborn可视化 预测 RandomForestRegressor
  • vite简单介绍和配置整理

    vite简单介绍和配置整理 一 介绍 Vite 法语 快的意思 是一个HTTP服务器 特殊的地方 可以在单文件中书写ES6语法 支持热更新 请求的内容才会被打包 更新 Rollup打包 二 配置 总的配置 import defineConf
  • MySQL 8.0 密码策略修改

    首次登录mysql 需要修改原始密码 mysql gt show databases ERROR 1820 HY000 You must reset your password using ALTER USER statement befo
  • Ground Rules

    Ground Rules 1 Ground rules ground ra nd n 地面 土 土地 土壤 v 触海底 使停飞 阻止 起飞 罚 儿童 不准出去玩 adj 磨细的 剁碎的 rule ru l n 规则 统治 控制 管理 v 统
  • C语言:getchar( ) 函数详解

    文章目录 一 getchar 函数定义 二 函数返回值 三 注意区分 getchar 和 scanf 四 getchar 的使用实例 一 getchar 函数定义 getchar 字符输入函数 没有参数 从输入缓冲区里面读取一个字符 一次只
  • 解决EasyExcel导出文件LocalDateTime报错问题

    文章目录 问题引出 解决方案 自定义Converter 引用 LocalDateTimeConverter 搞定收工 问题引出 狗子我在参与一个项目的时候接触到数据表格导出为Excel表格的需求 但是在导出的时候会出现报错 Cannot f
  • 代码走查和代码审查_代码审查是个好主意的其他原因

    代码走查和代码审查 什么是代码审查 What are Code Reviews A Code Review is essentially what it sounds like a review of code before it is a
  • 虚拟机由于电脑未正常关机打不开问题-两种情况

    虚拟机由于电脑未正常关机打不开问题 我来总结我遇到的两种情况 文章目录 虚拟机由于电脑未正常关机打不开问题 第一种情况 报错 锁定文件失败 第二种情况 报错 指定的虚拟磁盘需要进行修复 第一种情况 报错 锁定文件失败 如果出现锁定文件失败
  • Unity自动创建脚本及预制体并绑定

    自己写了一套流程控制的框架 根据不同的状态执行不同的命令 每个状态判断和命令都是一个场景中的物体 不想每次重复同样的操作 创建脚本再创建预制体再绑定脚本 所以尝试写了一个自动创建脚本与预制体的工具 StateMachineEditorUti
  • 指针解析 (*&p和&*p)

    p指向a p的值是a的地址 的作用 定义 int p 定义一个int类型的指针变量 取地址对应的数据 p 获取 下的值 p的值 对应的值 即 0x1000 5 p和 p的区别 p p 获取p的地址 即0x1008 p 即 0x1008 获取
  • matlab MinGW-w64 C/C++ Compiler 的配置(附百度云下载资源)

    环境 win10 matlab r2019b 起因 安装某matlab工具包时需要使用命令 mex setup 弹出常见错误 即需要编译器 两种编译器的尝试 由于那道墙的存在 让试错成本变得如此巨大 首先 matlab推荐了两种编译器 1
  • 漏洞公布平台汇总

    https www cnvd org cn https www seebug org https fr 0day today https www exploit db com https packetstormsecurity com
  • LU分解(matlab实现)

    LU分解 LU Decomposition 是矩阵分解的一种 可以将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积 主要的算法思路是从下至上地对矩阵A做初等行变换 将对角线左下方的元素变成零 这些行变换的效果等同于左乘一系列单位下三角矩
  • 区块链GAMEFI游戏——NFT+DeFi+游戏

    GameFi指的是将去中心化金融产品以游戏的方式呈现 将DeFi的规则游戏化 将游戏道具产品NFT化 即GameFi NFT DeFi 游戏 DeFi是GameFi的内核 NFT是去中心化的必备手段 而游戏是GameFi的外壳 NFT De
  • 视频编码格式发展史

    1 编码标准之战 想预测未来 就回顾历史 先来看看H 264这些编码的从标准化到现在普及的过程 人们一直在想尽办法提高视频编码的效率 让它在尽可能小的体积内提供最好的画面质量 从而满足人们对于视频传输 存储的需求 长期以来 视频编码标准主要
  • MySQL标准差和方差函数使用

    一 方差 方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量 概率论中方差用来度量随机变量和其数学期望 即均值 之间的偏离程度 统计中的方差 样本方差 是每个样本值与全体样本值的平均数之差的平方值的平均数 在许多实际问题中 研究
  • matlab求二元函数极值算法_[小白头秃]多元函数基本概念总结

    1 基本概念 点集 区间 领域 一维 直线 实数集 线段 端点 不含端点 二维 平面 实平面 平面区域 边界 不含边界 三维 空间 实空间 曲面 边界 体 表面 不含边界 表面 点和点集的关系 内点 外点 边界点
  • 四叉树初步研究

    JS 四叉树初步研究 四叉树 为何要叫四叉树 二叉树与八叉树又是生么东东 看样子理解起来比较困难 实现该如何入手 树 就是树的结构 树根 树干 树枝 树叶 还有好吃的果实 o 其实树这种结构 很常见的 JSON 不就是最普通的树吗 四叉树的