Tag: 数据结构

在avl树的红色黑树

AVL和红黑树都是自平衡的,除了红色和黑色的节点。 select红黑树而不是AVL树的主要原因是什么? 红黑树有什么用途?

检查二叉树是镜像还是对称

testing树是否对称的基本algorithm是什么? 因为它是一棵二叉树,所以我会假定它是一个recursion的sorting定义 正式的问题如下: 如果其左右子树是相同的镜像,即二叉树是对称的,则二叉树是其自身的镜像。 最好用几个例子来解释。 1 / \ 2 2 真正 1 / \ 2 2 \ 3 假 1 / \ 2 2 / \ / \ 4 3 3 4 真正 1 / \ 2 2 / \ / \ 3 4 3 4 假 1 / \ 2 2 / \ 3 […]

哈希表vs平衡二叉树

当我需要在哈希表或平衡二叉树之间进行select以实现集合或关联数组时,应考虑哪些因素?

C结构inheritance指针alignment

背景 我已经创build了一个基本的链接列表数据结构主要用于学习目的。 列表的一个目标是可以处理不同的数据结构。 因此,我在结构组成方面尝试过我的手来模拟C中的“inheritance”。下面是构成我的链表的基础的结构。 typedef struct Link { struct Link* next; struct Link* prev; } Link; typedef Link List; 在我的实现中,我select了一个作为列表头部和尾部的标记节点(这就是为什么链接==列表)。 为了让列表实际处理数据,一个结构只包含Link结构作为第一个成员: typedef struct { Link link; float data; } Node; 所以链表就像这样 ┌───┬───┬───┐ ┌───┬───┐ ┌───┬───┬───┐ … <—>│ P │ N │ D │<—>│ P │ N │<—>│ P │ N │ D │<—> … └───┴───┴───┘ └───┴───┘ […]

普通旧式C中的types安全通用数据结构

我做了比“普通的老C”编程更多的C ++编程。 在纯C编程时,我非常想念的一件事是通过模板在C ++中提供的types安全的通用数据结构。 为了具体,请考虑一个通用的单向链表。 在C ++中,定义自己的模板类是一件简单的事情,然后将其实例化为您需要的types。 在C中,我可以想到实现一个通用单链表的几种方法: 一次写入链表types和支持过程,使用void指针绕过types系统。 编写预处理macros以获取必要的types名称等,以生成数据结构和支持过程的特定于types的版本。 使用更复杂的独立工具来生成所需types的代码。 我不喜欢选项1,因为它颠覆了types系统,而且可能比特定types的实现具有更差的性能。 使用所有types的数据结构的统一表示,以及从void指针转换到/从void指针,据我所知,需要一个间接的,这是一个专门的元素types实现将避免。 选项2不需要任何额外的工具,但是感觉有些笨重,并且在使用不当时可能会给编译器带来不好的错误。 选项3可以提供比选项2更好的编译器错误消息,因为专用数据结构代码将以扩展forms存在,可以在编辑器中打开并由程序员检查(而不是由预处理器macros生成的代码)。 不过,这个选项是最重的,是一种“穷人的模板”。 我以前使用过这种方法,使用简单的sed脚本来专门化一些C代码的“模板化”版本。 我想用C而不是C ++来编写我的未来“低级”项目,但是由于想重写每种特定types的通用数据结构而感到害怕。 人们对这个问题有什么经验? 在C中有没有很好的通用数据结构和algorithm库,它们不会与选项1一起使用(即,从void指针进行转换,这会牺牲types安全性并增加间接级别)?

性能差异…如此戏剧性?

刚才我看了一些关于List<T> vs LinkedList<T>post ,所以我决定自己对一些结构进行基准testing。 我通过添加数据和从前端/末端删除数据,对Stack<T> , Queue<T> , List<T>和LinkedList<T>了基准testing。 基准testing结果如下: Pushing to Stack… Time used: 7067 ticks Poping from Stack… Time used: 2508 ticks Enqueue to Queue… Time used: 7509 ticks Dequeue from Queue… Time used: 2973 ticks Insert to List at the front… Time used: 5211897 ticks RemoveAt from List at the front… Time […]

如何在GHC中编写尽可能高效的数据结构?

所以有时我需要写一个我在Hackage上找不到的数据结构,或者我发现没有经过testing或者质量足够让我信任,或者只是我不想成为依赖的东西。 我正在阅读冈崎的书,它很好的解释了如何devise渐近快速的数据结构。 但是,我正在与GHC合作。 对于我的应用程序来说,恒定的因素是很重要 内存使用对我来说也是一个大问题。 所以我有关于GHC的具体问题。 尤其是 如何最大限度地共享节点 如何减less内存占用 如何避免由于不严格/懒惰造成的空间泄漏 如何让GHC为重要代码段产生严密的内部循环 我环顾了networking上的各个地方,我对如何使用GHC有一个模糊的想法,例如,看核心输出,使用UNPACK编译指示等。 但我不知道我明白了。 所以我popup我最喜欢的数据结构库,容器,并查看Data.Sequence模块。 我不能说我很了解他们正在做什么使Seq快速。 FingerTree a的定义首先引起我的FingerTree a 。 我认为这只是我不熟悉手指树而已。 第二个引人注目的是所有的SPECIALIZE杂项。 我不知道这里发生了什么事情,而且我很好奇,因为这些代码遍布各处。 许多函数也有与之相关的INLINE附注。 我可以猜出这是什么意思,但是如何判断什么时候使用INLINE函数呢? 在~475线附近的事情变得非常有趣,一节被称为“适用性build设”。 他们定义了一个新的包装来表示身份monad,他们自己写了严格的monad副本,他们有一个定义为applicativeTree的函数,这个函数显然是专用于身份monad的,这就增加了函数输出的共享。 我不知道这里发生了什么事。 正在使用什么巫术来增加分享? 无论如何,我不确定从Data.Sequence学到多less东西。 还有其他的“模范课程”,我可以读懂智慧吗? 我真的很想知道如果我真的需要他们加快速度,那么我的数据结构将会如何。 有一点特别是写数据结构,使融合变得容易,以及如何写好融合规则。

3D碰撞/物体检测如何工作?

我一直在想这个。 在像GTA那样有数千个物品的游戏中,一旦你在健康包里,游戏是如何知道的? 每个对象都不可能有一个事件监听器? 迭代也不好? 我只是想知道如何实际完成。

什么是图表可以解决比替代问题更好的问题的好例子?

阅读Stevey Yegge的“ 获得工作”在Google的文章中,我发现这个有趣的小引语: 每当有人给你一个问题,想想图。 他们是代表任何一种关系的最基本和最灵活的方式,所以任何一个有趣的devise问题都会涉及一个图表。 请确保在转向其他解决schemetypes之前,无法想象使用图解解决此问题的方法。 这个提示很重要! graphics数据结构/algorithm最能代表和/或解决哪些问题的例子是什么? 我可以想到的一个例子是:导航单元(ala Garmin,TomTom),提供从当前位置到另一个位置的路线方向,利用graphics和高级pathalgorithm。 还有其他什么?

CopyOnWriteArrayList如何可以线程安全?

我已经看了一下CopyOnWriteArrayList OpenJDK源代码 ,看起来所有的写操作都被相同的锁保护,读操作根本不受保护。 据我所知,在JMM下,所有对variables(读取和写入)的访问都应该受到锁的保护,否则可能会发生重新sorting效应。 例如, set(int, E)方法包含这些行(在locking下): /* 1 */ int len = elements.length; /* 2 */ Object[] newElements = Arrays.copyOf(elements, len); /* 3 */ newElements[index] = element; /* 4 */ setArray(newElements); 另一方面get(int)方法只return get(getArray(), index); 。 在我对JMM的理解中,这意味着如果语句1-4像1-2(新)-4-2(copyOf)-3一样被重新sorting, get可能会观察到数组处于不一致状态。 我是否不正确地理解JMM,或者有什么解释说明为什么CopyOnWriteArrayList是线程安全的?