| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 点合并算法的思考 -> 正文阅读 |
|
[数据结构与算法]点合并算法的思考 |
1.写在前面去年因为某项目遇到模型卡顿问题,分析原因发现是模型中点没有进行合并,故而设计了点合并的技术方案,由于某些原因该方案未能实施,仅仅是方案,放在技术方案堆里,以一篇文档形式。 平时的积累尤其重要,尝试更优,加之日积月累,会有比较大的进展和进步,技术如此,工作也一样。 平时面试偶尔也会以该题目为背景问一下面试者,看看思路怎样,有想法还不错的,也有不知所措的...好了,闲扯到这里,开始吧。 2.思路2.1.方案一ifcOpenShell是将点的hash作为key,建立map,map<pair<pair<x,y>, z>, T>,这样利用map(特化的红黑树)的查取效率,效率较高,查取一次复杂度为o(logN),整个点合并过程复杂度为o(N*logN)。这是一种实现成本低,且效率较高的方式,值得使用或借鉴。 2.2.方案二曾经有面试者这样回答:
该思路对吗? 如果只建立格子而不进行格子间的去重合并,那么这个过程复杂度确实是o(N),但是这是满足不了要求的,因此需要对格子进行去重归并,单单是归并,如果是高效的方法,复杂度也是o(N*logN)。 面试的同学又说了,
这样的说法正确吗? 我们来推敲一下,数组存储空间是连续的,下表索引定位复杂度确实是o(1),如果存在这样符合条件的数组就可以,那么存在吗?前提是对点列表所属三维空间进行全区域覆盖的格子建立,形成全区域的覆盖的三维数组,然后每建立一个格子,就去进行代价为3*o(1)的查询,返回格子索引(即合并后点的索引)。看出问题了没?“对点列表所属三维空间进行全区域覆盖的格子建立,形成全区域的覆盖的三维数组”这个过程复杂度为多少?o(1)~o(n^3)?最坏为多少?这种方式恐怕是捡了芝麻,丢了大西瓜。 那么可以在上述思路的基础上进行改进吗? 可以的,无须建立全空间区域覆盖的格子,将格子的三个索引作为key进行搜索,其实和上述方案一是一样的了。 2.3.方案三利用布尔短路运算、红黑树、嵌套的动态生长的红黑树思路进行方案设计, 看到这里应该还是困惑,这有什么高效吗?
实际上该方案复杂度仍为o(N*logN),但是系数相比降下来了,而且内存占用也少,对于极端的情况,
明白了没?方案三整体复杂度没有下降,但是其效率系数和内存系数均有提升,因为实际点列表情况基本都介于上述两个极端之间。 进行完点合并之后,“嵌套的动态生长的红黑树”是一颗不完全生长的树,即存在x,y都一样的点对应的分支是完全生长的,其他的都是不完全生长的,内存和计算过程均有精简。 2.4.方案四将x,y,z计算一个哈希值,这样建立一个map就可以,省事。这样理论可行,但是将三个坐标分量压缩为一个哈希值会有哈希计算重复的概率,也就是有不准确的概率,可能会把两个根本不一样的点认为是同一个点。 ?3.总结
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 3:38:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |