我们有这样的层次结构:
- 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”,所以在。但这是最不需要的步骤。
那么,您能否建议可以在此处使用的任何算法来生成所需的标识符?
更新修复了示例。附:我知道这是错误的。
最佳答案
你太迷恋小数了。
- 选择一个值
X
,它代表节点内子节点的最大数量,或者是任何大于您认为方便使用的数字。 - 放弃对十进制数字的坚持,并将所有标识符表示为以
X
基数表示的整数。 - 将标识符编码为基
X
中的整数,其中第一个数字表示节点树的顶层,第二个数字表示第二层,依此类推。
因此,如果您幸运的话,X
的合理值是 16,那么您可以使用整数的十六进制表示形式。如果 36 是一个合适的值,请使用任何字母数字字符作为数字。
编辑
正如 Rafael 所指出的,如果无法定义节点可以拥有的子节点数量的上限,则这种方法就会失败。根据我的经验,这在实践中不太可能成为严重问题。
如果X
的值很大,比如863
,那么我建议明显的实现是设置X = 1000
并且使用 3 个十进制数字组来表示基数 1000
中的每个数字。这样标识符 12.245.1
将表示为 12245001
。
现在我们进入了阿莱斯坦尼斯答案已经涵盖的领域
关于algorithm - 根据其位置计算分层结构中元素的唯一整数标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13139536/