algorithm - 根据其位置计算分层结构中元素的唯一整数标识符

标签 algorithm

我们有这样的层次结构:

- 1 ( identifier = 100 )
  - 1 (101)
  - 2 (102)
  - 3 (103)
    - 1 (1031)
    - 2 (1032)
    - 3 (1033)
  - 4 (104)
    - 1 (1041)
    - 2 (1042)
    - 3 (1043)
  -901 (1001)
- 2 (200)
  - 1 (201)
  - 2 (202)
- 10 (1000)
  - 1 (1001)

所需特征:

  • 每个节点的标识符应该是唯一的。
  • 标识符应根据元素的级别相应递增
  • 标识符应为整数类型。
  • 每个元素的计数器在每个新级别/父元素时都会重置

正如您在元素 1.901 和 10.1 的示例中看到的,当前的实现不起作用。 我们尝试了下一个解决方案:

  • 将每个级别乘以数字。
  • 仅将第一个级别乘以一个数字并添加每个子级

如果标识符是字符串,则变得更容易,在这种情况下,我们可以使用下一种方式:“level1.level2.level3...”,因此对于 1 -> 1 它将是“1.1”,所以在。但这是最不需要的步骤。

那么,您能否建议可以在此处使用的任何算法来生成所需的标识符?

更新修复了示例。附:我知道这是错误的。

最佳答案

你太迷恋小数了。

  1. 选择一个值X,它代表节点内子节点的最大数量,或者是任何大于您认为方便使用的数字。
  2. 放弃对十进制数字的坚持,并将所有标识符表示为以 X 基数表示的整数。
  3. 将标识符编码为基 X 中的整数,其中第一个数字表示节点树的顶层,第二个数字表示第二层,依此类推。

因此,如果您幸运的话,X 的合理值是 16,那么您可以使用整数的十六进制表示形式。如果 36 是一个合适的值,请使用任何字母数字字符作为数字。

编辑

正如 Rafael 所指出的,如果无法定义节点可以拥有的子节点数量的上限,则这种方法就会失败。根据我的经验,这在实践中不太可能成为严重问题。

如果X的值很大,比如863,那么我建议明显的实现是设置X = 1000并且使用 3 个十进制数字组来表示基数 1000 中的每个数字。这样标识符 12.245.1 将表示为 12245001

现在我们进入了阿莱斯坦尼斯答案已经涵盖的领域

关于algorithm - 根据其位置计算分层结构中元素的唯一整数标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13139536/

相关文章:

c++ - 第 n 个斐波那契数的调用次数

算法题: flipping columns

algorithm - Raft算法正常操作

algorithm - 如何创建随机路径?

algorithm - 选择具有最小总体差异的数字对

c# - C# 中的 QuickSort 错误复杂性

algorithm - 清空所有水桶的最少移动次数,这些水桶最初的容量相同但水量不同。我只能从左向右移动

algorithm - 哪一个是撤消/重做行为的可接受约定?

performance - 如何为一般情况编写伪代码?

c# - C# 中 Astar (A*) 图搜索数据的结构