辞書を作成するのにPythonを使用していましたが、データが大きくなるにつれてメモリエラーが発生し始めたので、メモリを節約して、結果は同じではありません。私はこれがdefaultdictの動作と関係していると思います(しかし私は分かりません)。同様のコマンドでpythonとmysqlの結果が異なっています
ここで作業Pythonのコード(それは基本的に値のテーブルを作成します)です。結果は(あなたがコメントで内訳を見ることができる値の大きなテーブルで
from collections import defaultdict
data = [2,5,10]
target_sum = 100
# T[x, i] is True if 'x' can be solved
# by a linear combination of data[:i+1]
T = defaultdict(bool) # all values are False by default
T[0, 0] = True # base case
for i, x in enumerate(data): # i is index, x is data[i]
for s in range(target_sum + 1): #set the range of one higher than sum to include sum itself
for c in range(s/x + 1):
if T[s - c * x, i]:
T[s, i+1] = True
#check the python dict results
count = 0
for x in T:
if T[x] == True:
print x, ':', T[x]
count = count +1
print 'total count is ', count
#False is 152 and True is 250. Total is: 402
これは正しい結果である私は。しかし、最初のfor文の最後の行をローカルdictではなくデータベースに追加するように変更すると、結果が異なります。
cursor = conn.cursor()
cursor = conn.cursor()
cursor.execute ("DROP TABLE IF EXISTS data_table")
cursor.execute ("""
CREATE TABLE data_table
(
value CHAR(80),
state BOOL
)
""")
#with database
for i, x in enumerate(data): # i is index, x is data[i]
for s in range(target_sum + 1): #set the range of one higher than sum to include sum itself
for c in range(s/x + 1):
cursor.execute(""" SELECT value, state FROM data_table WHERE value='%s' """ % ([s - c * x, i]))
if cursor.rowcount == 0:
#print 'nothing found, adding'
cursor.execute (""" INSERT INTO data_table (value, state) VALUES ('%s', False)""" % ([s - c * x, i]))
elif cursor.rowcount == 1:
cursor.execute (""" UPDATE data_table SET state=True WHERE value = '%s'""" % ([s - c * x, i]))
#print 'record updated'
conn.commit()
#False is 17 and True is 286. Total is: 303
ちょうど(あなたがコードを実行したくない場合には)それをまとめるために、defaultdictはこの中に何かが照会され、偽のエントリを(作成:
は、ここに問題がある、私の変更されたコードですケースif T[s - c * x, i]:
)この機能を複製するには値のmysql検索を行い、それが存在しない場合は作成し、存在する場合はtrueに設定します。機能を正確に再現できないのではないでしょうか。
私が考えていた唯一のもう一つの点は、結果が(222, 0) : False
と表示されていますが、mysqlは[222,0]
これを指摘していただきありがとうございます。私はそれを修正しました。今はすべてが偽です。しかし、アルゴは、過去の要求を見て、それが以前に作られた場合は値を変更することによって動作します。 – Lostsoul
@Lostsoul私の更新された答えをチェックしてください。そのエラーは唯一のものではありません。 – mgibsonbr
@Lostsoul私はまた、真の値 – mgibsonbr