37,719
社区成员
发帖
与我相关
我的任务
分享
# 创建 AB 表 ,字段 A 存放 A 序号, 字段 B 存放 B 序号, 字段 DATAS 存放 A+B 的 DATAS
import sqlite3
conn = sqlite3.connect('KML_AB.db')
print("Opened database successfully")
c = conn.cursor()
c.execute('''CREATE TABLE AB (A CHAR(4),B CHAR(4),DATAS TEXT);''')
print("Table AB created successfully")
conn.commit()
conn.close()
print("# Datebase closed")
#循环求解 KML00.db 与KML01.db 是内容完全一样的文件
import time
t1 = time.perf_counter()
import sqlite3
conn0 = sqlite3.connect('KML00.db')
conn1 = sqlite3.connect('KML01.db')
conn2 = sqlite3.connect('KML_AB.db')
c0 = conn0.cursor()
c1 = conn1.cursor()
c2 = conn2.cursor()
print("# Opened database successfully")
try:
for x in range(24):
c0.execute("select rowid,name,datas from A where rowid =" + str(x+1))
result0 = c0.fetchone()
for y in range(72):
c1.execute("select rowid,name,datas from B where rowid =" + str(y+1))
result1 = c1.fetchone()
sData =""
for z in range(729):
sData = sData + str(int(result0[2][z])+int(result1[2][z]))
if('2' in sData):
#print(sData)
continue
else:
sqlAB = "INSERT INTO AB (A,B,DATAS) VALUES ('" + result0[1]+"','"+result1[1] + "','" + sData + "');"
c2.execute(sqlAB)
#print("exe")
conn2.commit()
print ("# Operation done successfully")
finally:
conn0.close()
conn1.close()
conn2.close()
print("# Datebase closed")
print('# IniaSec:',time.perf_counter()-t1)
# IniaSec: 1.6601536639991537
#读取的字符串,转换成二进制数:
string = '1001'
num = int(string, 2)
#原字符串就转换成整数 9 或 0b1001
#-------------------------------------
#数字转换回原来的字符串:
str(bin(9))
#数字就转回原 串 '0b1001'(需要删掉开头的 0b 两个字符)
2. 分析你的要求,只有当 1 和 1 碰到一起的时候,数据不可用。其他0 和 1, 0 和0 都可以。
这个跟二进制的 按位 ’与' 的真值表 吻合。
所以,计算可以这样进行:
把字符串转换成数字, 进行 “按位与” 操作,
如果结果等于 0 ,那么数据可用, 否则说明至少有两位同为1,所以不可用。
然后把等于零的数据对 进行”按位或“,得到的结果 继续与下一组的数进行”与“操作。
这是因为: 从group1、group2取了两个数 g1[i] 和 g2[j], 如果"按位与"g1[i] & g2[j] 不等于零,
那个 后面的13组无论取什么,包含g1[i] 和g2[j]的组合都不可用。
比如:
g1[0] = 0b1001
g2[0] = 0b11000
g2[1] = 0b110
g1[0] & g2[0] = 8 不等于零,g1[0] 和 g2[0] 的组合就不可用
g1[0] & g2[1] = 0 所以 g1[0] 和 g2[1] 的组合可用
然后 把 g1[0] 和 g2[1] 进行”或“操作,
即 g1[0] | g2[1] = 0b1111 , 这个值等待读入下一组进行迭代。
因此,计算比较 的算法:
第一次读两个组的数据,
交叉“按位与&”
if 等于零, 进行 “按位或 |”操作,结果存起来
else: 抛弃
迭代, 读下组数据, 继续“与”“或”操作
继续下去,直到15组完,剩下的就是想要的结果。
计算机做 按位与或运算 非常快的
遍历的算法,可能需要用到 深度优先搜索(DFS)算法,研究一下DFS看看行不行
个人拙见,不知对否。