我有三个列表:word
,occurrence
和alphabet
:
occurrence = [2, 1, 3, 10] # but can be initialized differently
k = len(occurrence)
alphabet = [range(k)]
N = sum(occurrence)
word = [0]*N # initially
word
是一个列表,其中将包含alphabet
所确定的从occurrence
中提取的值的特定组合。在上面的示例中,word
必须包含两个0
,一个1
,三个2
和十个3
的某种组合。 alphabet
可用于索引occurrence
。
我有一种算法(see List-Fixed-Content by Sawada),可以将alphabet
中的“字母”递归添加到word
中或从中删除,从而减小occurrence
的相应索引中的值添加字母时,删除字母时增加该值。
该算法从最高字母开始(在这种情况下首次初始化时为3
),其中occurrence
中的对应索引仍大于零,然后随着算法的进行,移至下一个最高位仍大于零的字母。
我目前正在处理此问题,方法是在letter
出现时通过word.remove(letter)
删除word.insert(i,letter)
,然后在出现次数再次增加时使用alphabet
将其重新添加到正确的位置。这使得在occurrence = [2, 5, 3, 5] # example occurrence
k = len(occurrence)
alphabet = [range(k)]
N = sum(occurrence)
word = [0]*N
def algorithm(t, p):
if t > N:
if N % p == 0:
yield word.copy()
else:
letter = max(alphabet)
i = len(alphabet)-1
while letter >= word[t-p-1]:
word[t-1] = letter
occurrence[letter] -= 1
if not occurrence[letter]: # <<<<
i_removed = remove(letter)
if letter == word[t-p-1]:
yield from algorithm(t+1, p)
else:
yield from algorithm(t+1, t)
if not occurrence[letter]: # <<<<
add(i_removed, letter)
occurrence[letter] += 1
i -= 1
letter = get(i) # <<<<
def remove(letter):
i = alphabet.index(letter)
alphabet.remove(letter)
return i
def add(i, letter):
alphabet.insert(i,letter)
def get(i):
if i < 0:
return -1
else:
return alphabet[i]
def execute()
yield from algorithm(1, 1)
# Example usage of function
print(list(execute()))
降级字母中找到最大值非常容易。
要求的完整代码:
list.insert
我发现这非常慢,我怀疑是由于alphabet
造成的。查找occurrence
中对应值非零的alphabet
的最高字母和次高字母的更好方法是什么,而无需从...
letter = max(alphabet[occurrence > 0])
while letter >= limit: # some limit
...
while True: # <<<< replaces remove(), add(), and get()
letter -= 1
if letter < 0 or occurrence[letter] > 0:
break
添加和删除字母?
类似于将列表分配为numpy数组和以下代码?
"expo": "^32.0.0"