【发布时间】:2011-09-13 09:39:40
【问题描述】:
我目前有一个脚本可以计算化学库指纹上的谷本系数。然而,在测试过程中,我发现由于我比较位串的方法(它只需要太长时间),我的实现无法切实扩大。见下文。这是我需要改进的循环。我已经对此进行了简化,因此它只是查看两个结构,真实脚本对结构数据集进行排列,但这会使我在这里遇到的问题过于复杂。
LOOP
-- Find the NA bit
SELECT SUBSTR(qsar_kb.fingerprint.fingerprint, var_fragment_id ,1) INTO var_na FROM qsar_kb.fingerprint where project_id = 1 AND structure_id = 1;
-- FIND the NB bit
SELECT SUBSTR(qsar_kb.fingerprint.fingerprint, var_fragment_id ,1) INTO var_nb FROM qsar_kb.fingerprint where project_id = 1 AND structure_id = 2;
-- Test for both bits the same
IF var_na > 0 AND var_nb > 0 then
var_tally := var_tally + 1;
END IF;
-- Test for bit in A on and B off
IF var_na > var_nb then
var_tna := var_tna + 1;
END IF
-- Test for bit in B on and A off.
IF var_nb > var_na then
var_tnb := var_tnb + 1;
END IF;
var_fragment_id := var_fragment_id + 1;
EXIT WHEN var_fragment_id > var_maxfragment_id;
END LOOP;
举个简单的例子
结构 A = '101010'
结构 B = '011001'
在我的真实数据集中,二进制的长度为 500 位及以上。 我需要知道:
1)Both 共有的 ON 位数
2)A中ON但B中关闭的位数
3)B中ON但B中关闭的位数
所以在这种情况下
1) = 1
2) = 2
3) = 2
理想情况下,我想改变我这样做的方式。我不想让每个字符串中的每个位都变得太费时,因为当我将整个系统扩展到数千个结构时,每个结构的指纹位字符串的长度顺序为 500-1000
我解决这个问题的逻辑是:
将两者的总位数设为 ON
A) = 3
B) = 3
然后执行 AND 操作,找出两者都有多少位 = 1
然后只需从总数中减去这个,就可以找到一个而不是另一个的位数。
那么如何对两个 0 和 1 的字符串执行 AND 类似操作以找到常见 1 的数量?
【问题讨论】:
-
Structure A = '101010'。这些字符串是由字符 0 和 1 还是由位组成的? -
它是一个由 0 和 1 组成的 varchar2。
标签: sql oracle plsql bit-manipulation logical-operators