Tag: 计算机科学

二进制堆的有效实现

我在寻找如何有效地实现二进制堆的信息 。 我觉得应该有一个好的文章有关实施堆,但我还没有find一个。 事实上我一直没有find任何有关如何将数据堆存储在基础之上的有效实现方面的资源。 我正在寻找制作快速二进制堆的技术,超出了我在下面描述的范围。 我已经写了一个比Microsoft Visual C ++和GCC的std :: priority_queue更快的C ++实现,或者使用std :: make_heap,std :: push_heap和std :: pop_heap。 以下是我在实现中已经涉及到的技术。 我自己只提出了最后两个,但我怀疑这些是新的想法: (编辑:增加内存优化部分) 从1开始索引 查看二维堆的维基百科实现注释 。 如果堆的根位于索引0处,则索引n处的父节点,左节点和右节点的公式分别为(n-1)/ 2,2n + 1和2n + 2。 如果使用基于1的数组,那么公式将变得更简单n / 2,2n和2n + 1.因此,在使用基于1的数组时,父项和左项是更高效的。 如果p指向一个基于0的数组,并且q = p-1,那么我们可以像q [1]那样访问p [0],所以在使用基于1的数组时没有开销。 在更换叶子之前,将popup/移除元素移到堆的底部 在一个堆上popup通常是通过replace最左边的底部叶子的顶部元素,然后将其向下移动直到堆属性被恢复来描述。 这要求每个级别进行2次比较,而且我们可能会在堆栈顶部移动一个叶子,因此可能会走得很远。 所以我们应该期望有less于2个log n的比较。 相反,我们可以在堆顶部留下一个洞。 然后,我们通过迭代地将更大的孩子向上移动,将这个洞向下移动。 这只需要我们通过每个级别1比较。 这样孔就会变成一片叶子。 在这一点上,我们可以将最右边的底部叶子移动到洞的位置,并移动该值直到堆属性恢复。 既然我们移动的价值是一片叶子,我们不期望它移动到树上很远。 所以我们应该期待比log n比较多一点,这比以前更好。 支持replace顶部 假设你想删除最大的元素,并插入一个新的元素。 […]

math计算机科学

我已经阅读了几个关于这个主题的答案,但是我仍然有疑问。有很多math课程,我不知道哪一个要先拿。 每个计算机科学家应该选哪个math课程? 哪一类应该是第一个,为什么?

什么时候使用Preorder,Postorder和Inorder二叉search树遍历策略

我最近意识到,虽然在我的生活中使用了BST的丰富,但我从来没有想过使用除Inorder遍历之外的任何东西(虽然我意识到并知道如何使程序适应前/后顺序遍历)。 在意识到这一点之后,我拿出了一些旧的数据结构教科书,并在前序遍历和后序遍历的有用性之后寻找推理 – 虽然他们没有多说。 实际上什么时候使用前序/后序? 什么时候比有序更有意义?

certificate一个随机生成的数字是均匀分布的

我在接受采访时被问到了这个问题。 给定一个随机数发生器产生一个数字[0,N),如何certificate这个数是均匀分布的。 我不知道如何解决这个问题,有什么build议吗?

最终的一致性在简单的英语

我经常听说关于NoSQL,数据网格等不同演讲的最终一致性。似乎最终一致性的定义在许多来源中是不同的(甚至可能取决于具体的数据存储)。 任何人都可以简单地解释一下最终一致性是什么,与任何具体的数据存储没有关系?

检测树结构之间的差异

这更像是一个CS问题,但却是一个有趣的问题: 比方说,我们有2个树结构,或多或less相同的节点重组。 你会如何发现 任何 在某种意义上说是最小 操作顺序 MOVE(A, B) – 移动节点B下的节点A(整个子树) INSERT(N, B) – 在节点B下插入一个新节点N. DELETE (A) – 删除节点A(与整个子树) 将一棵树转换为另一棵树。 可能显然存在这样的转换不可能的情况,根本上是小孩B与小孩A之间的根B)。 在这种情况下,algorithm只会传递一个“ 不可能 ”的结果。 更壮观的版本是对networking的一种推广,即当我们假设一个节点可以在树中多次出现(实际上有多个“父母”),而周期是禁止的。 免责声明:这不是一个家庭作业,实际上它来自一个真正的商业问题,我发现它是相当有趣的,想知道如果有人可能知道一个解决scheme。

什么是熵的计算机科学定义?

我最近在我的大学开始了一个关于数据压缩的课程。 然而,我发现“熵”这个术语在计算机科学中应用的含义很模糊。 据我所知,它大致转化为系统或结构的“随机性”。 计算机科学“熵”的正确定义是什么?

B树与哈希表

在MySQL中,索引types是b树,访问b树中的元素是处于对数分摊时间O(log(n)) 。 另一方面,访问哈希表中的元素在O(1) 。 为什么不使用散列表而不是b-tree来访问数据库中的数据?

为什么二进制而不是三元计算?

是不是一个立即能够掌握更多信息和处理更大价值的三态对象? 我知道处理器目前使用大规模的异或门networking,需要重做。 由于我们处于64位(我们可以表示2 ^ 63个可能的状态),所以计算等效三元生成可以支持具有30个十位以上的数目log(3 ^ 63-2 ^ 63)。 我想象一下,检测+1和0之间的电位差就像在-1和0之间一样容易。 硬件,功耗或芯片密度的某些竞争力会抵消存储和计算能力方面的任何收益吗?

Byte数组是什么意思?

有人可以解释,我不完全明白 什么是字节数组 我们何时何地在应用程序/程序中使用它 什么是使用字节数组的优点和缺点