使用二进制字符串存储数据库中的有序项

时间:2015-01-22 01:40:34

标签: database algorithm

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'?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

二进制字符串是 fractions ,而不是整数;小数点总是在开头(或在@ boisvert的答案之后的第一个数字之后;只要小数点的位置是固定的,它就没有任何区别。当然,它实际上是一个二进制点,因为它们是二进制数。)

找到平均值:

  1. 如果字符串长度不同,请在较短字符串的末尾放置足够的0 s,使其与较长字符串的长度相同。
  2. 使用二进制加法将两个字符串加在一起,始终将最后一个字符串放在开头,即使它是'0'。 [见下面的算法]。
  3. 删除最后的0
  4. 示例1:101110111

    1. 使用0扩展第一个字符串:1011010111
    2. 求和:

          A:  10110
          B:  10111
      Carry: 101100
        Sum: 101101
      
    3. 没有尾随零,因此结果为101101

    4. 示例2:1111000

      1. 1110    1000
      2. 10110
      3. 1011
      

      在结束时开始和插入:

      放入数据库的第一个项目标签为1。如果您在任何时候需要在开头添加项目,请使用前面带有0的第一个标签。同样,如果您需要在最后添加项目,请使用前面带有1的第一个标签。

      二进制加法:

      由于弦长相同,这很容易;将Carry设置为0,并从后向前扫描两个字符串。 (输出也是从前到后产生的。)

      在每个位置: *如果Carry和两位数之和为13,则输出1,否则输出0。 *如果Carry和两位数之和为23,请将Carry设置为1,否则将其设为0

      完成所有数字后,输出Carry的值。

      实际实施:

      实际上,你不会使用二进制字符串;你会使用一些相当大的基础,唯一的要求是它是均匀的。但算法是一样的。在构造数字的表示时,需要按字母顺序为字符分配数字,以便生成的字符串可以按字母顺序排序而不将其转换为数字;数据库不知道如何转换为数字,但它知道如何按字母顺序对字符串进行排序。