我不确定"排列"是一个正确的单词,但情况是我的List
为〜Objects
。每个不同的Object
都有不同的value
和cost
。
假设我的对象包含介于1和5之间的value
。我正在尝试合并超过某些targetValue
的对象列表,找到总数最低cost
的组合,并返回该组合。此组合可能包含List
中的一个对象的许多重复项。
例如,如果我的对象列表是{a,b,c,d};输出可以是{a,a,a,a,a,a,a,a,a,a}。但请注意,顺序也很重要。 {a,a,b}可能具有与{a,b,a}
不同的总值目前,我一直试图强行解决问题。但是,40!组合,我正在耗尽记忆,同时跟踪所有不同的排列"。
我仍然倾向于贯穿每一个组合的准确性,增加执行计算的时间不是问题,但正如我之前所说,最大的问题是记忆。
当前代码:( incompleteList以起始对象开头)
while (incompleteList.size() > 0)
{
Container container = incompleteList.get(0);
for (myObject o : objectList)
{
Container newAdditionContainer = new Container(container);//copies the list of objects into a new container
newAdditionContainer.addMyObject(o);
if (newAdditionContainer.getTotalValue()) < targetValue)
{
incompleteList.add(newAdditionContainer);
} else {
completeList.add(newAdditionContainer);
}
}
incompleteList.remove(container);
} //code then loops through completeList and grabs the container with the cheapest cost,
//but in actuality that code hasn't been able to run yet.
我非常确定上述内容是否可行,如果它能够完成(但由于内存不能);如何更改算法以尝试获得最低成本并保持在内存限制内?
答案 0 :(得分:2)
构建一个PermIterator
,其中包含List
Object
个permutation length
和所需的Iterate
。 Iterator
此length
iteration
以length
1开头,直到permutations
完整value
permutation
所有permutation
超过所需permutation length
。始终只存储实际permutations
和当前最佳List
,其超出期望值且成本最低,与Object
无关。
这样就可以避免在def inventory():
with open('inventory.log', 'r+') as f:
match_hostname = re.compile(r'NAME: "(.+)",')
match_pid = re.compile(r'PID: (.+) ,')
match_sn = re.compile(r'SN: (.+)')
list_text = [text.strip() for text in f]
for line in list_text:
match_regex_hostname = match_hostname.search(line)
match_regex_pid = match_pid.search(line)
match_regex_sn = match_sn.search(line)
if match_regex_hostname:
final_hostname = match_regex_hostname.group(1).strip(" ")
print final_hostname
elif match_regex_pid:
final_pid = match_regex_pid.group(1).strip(" ")
print final_pid
elif match_regex_sn:
final_sn = match_regex_sn.group(1).strip(" ")
print final_sn
inventory()
中存储所有LAB-SW01#show inventory
NAME: "LAB-SW01", DESCR: "My Switch"
PID: AS-2001-XT , VID: N/A, SN: ABA0923K0DN
并导致内存不足。显然有40 shelfNumber = int(raw_input('What is the shelf number? '))
row = int(shelfNumber / 5.1) + 1
unit =
s这仍然需要很长时间。
答案 1 :(得分:1)
如果您在对数据执行任何操作之前尝试加载所有可能的数据,则会耗尽内存。这在读取大文件时也是一个问题。
一个简单的解决方案是,如果有很多值,则不存储所有值,而是在装箱时处理它们。
我建议你每次创建一个新的排列时都要调用一个回调或lambda。这样你就不需要存储它们了。
注意40!排列你可能会用完时间。每微秒一个,需要2.5e34年。比行星还要长。