在this post中,@ boisvert提到如果使用字符串作为顺序字段的值,最好显示二进制字符串,然后给出一个算法来计算两个二进制字符串的平均值如下:
Avalue = 1+0*(1/2)+1*(1/4)+1*(1/8)
Bvalue = 1+1*(1/2)+0*(1/4)+0*(1/8)
average, new value = 1+0*(1/2)+1*(1/4)+1*(1/8)+1*(1/16) new string = "10111"
content order
--------------------
A '1011'
new! '10111'
B '1100'
C '1101'
我无法理解这些,第一项放入数据库的价值以及插入之前/之后的项目是什么?如何计算' 1011'之间的平均值。以及新值' 10111'或者' 111'和' 1000'?
非常感谢任何帮助。
答案 0 :(得分:0)
二进制字符串是 fractions ,而不是整数;小数点总是在开头(或在@ boisvert的答案之后的第一个数字之后;只要小数点的位置是固定的,它就没有任何区别。当然,它实际上是一个二进制点,因为它们是二进制数。)
0
s,使其与较长字符串的长度相同。0
。1011
和10111
0
扩展第一个字符串:10110
和10111
求和:
A: 10110
B: 10111
Carry: 101100
Sum: 101101
没有尾随零,因此结果为101101
111
和1000
1. 1110 1000
2. 10110
3. 1011
放入数据库的第一个项目标签为1
。如果您在任何时候需要在开头添加项目,请使用前面带有0
的第一个标签。同样,如果您需要在最后添加项目,请使用前面带有1
的第一个标签。
由于弦长相同,这很容易;将Carry设置为0,并从后向前扫描两个字符串。 (输出也是从前到后产生的。)
在每个位置:
*如果Carry和两位数之和为1
或3
,则输出1
,否则输出0
。
*如果Carry和两位数之和为2
或3
,请将Carry设置为1
,否则将其设为0
。
完成所有数字后,输出Carry的值。
实际上,你不会使用二进制字符串;你会使用一些相当大的基础,唯一的要求是它是均匀的。但算法是一样的。在构造数字的表示时,需要按字母顺序为字符分配数字,以便生成的字符串可以按字母顺序排序而不将其转换为数字;数据库不知道如何转换为数字,但它知道如何按字母顺序对字符串进行排序。