Prefix Sum and Adjacent Difference
理论上来讲前缀和以及差分两种思路应该是算法基础, 是那种堪比排序的基础, 按理说应该掌握得很好才对. 但由于没有系统性学习, 导致后面在学习部分变种树结构的时候非常吃力. 前缀和 是一种预处理方法, 能够实现后续相关查询达到 $O(1)$ 的时间, 以下又分几种情况 一维前缀和 这个方法通常解决”数组前 n 项之和”这个问题, 如下 std::vector<int> p...
理论上来讲前缀和以及差分两种思路应该是算法基础, 是那种堪比排序的基础, 按理说应该掌握得很好才对. 但由于没有系统性学习, 导致后面在学习部分变种树结构的时候非常吃力. 前缀和 是一种预处理方法, 能够实现后续相关查询达到 $O(1)$ 的时间, 以下又分几种情况 一维前缀和 这个方法通常解决”数组前 n 项之和”这个问题, 如下 std::vector<int> p...
注意事项 解析一下 Klayout 中 Flatten Cell 功能是如何实现的. 与之相似的功能有: Flatten Instance, Flatten Region, 相似功能会在介绍过程中提及. 当然, 在了解如何实现之前, 首先得明确理解这个功能是什么, Klayout 文档中清晰描述了这个: The “flatten cell” operation flattens a...
在任何情况下, 都请使用 using using 的使用方式与 typedef 一致, 可以帮助另取类型别名我们省略一大段的类型拼写(尤其在各种类嵌套的情况), 同时还能够增加代码的可读性. 一般的理解中, using 与 typedef 的作用完全一致, 仅仅存在语法上的不同, 如下: typedef unstable_box_tree <box_type, vector...
区分 {} 与 () 两种构造方式 // C++的一些构造方式 Object obj_default; // 默认构造 Object obj_copy = obj1; // 拷贝构造 obj_copy = obj1; // 赋值, 非构造 Object obj_uniform{}; // 统一初始化 C++ 具有非常沉重的历史包袱, 为了向前兼容, 必须要保留...
box_tree_node 一眼四叉树的树结点数据结构 /** * @brief The node object */ template <class Tree> class box_tree_node { public: typedef typename Tree::point_type point_type; typedef typename Tree::...
Klayout 提供了一套多线程的框架, 在 EDA 这样的计算密集型场景下, 每个核心只需一个线程即可达到高负载. 因此此处的 multithread 可以等价于 multiworker. JobBase
一个非常通用的扫描线算法流程, 在 Klayout 内部对许多运算中都用到的运算框架. 要注意的是, 由于 Klayout 的项目几乎通过一个人开发, 为了避免代码膨胀减轻维护压力, 所以有大量的代码复用. 然而这是一个双刃剑, 代码维护轻松了, 但是由于一个流程框架涉及众多命令, 因此势必相较于特例化的算法流程而言更加复杂低效. 很难读懂, 一个看似没什么作用的值重置可能都隐含着一类命令...
通常而言, auto 能够根据类型推导规则推导出你想要的类型. 然而, 由于推到规则的限制, 部分情况下可能需要引导编译器推导出你想要的类型. prefer auto to explicit type declaration 这是一个建议, 事实上众多自带类型推导的语言同样承担了很多大型项目, 这一点几乎就可以确定显式类型推导并不一定是一个大型项目的必要条件. 一个良好的变量命名即可解决...