為什麼別人Python寫的演算法解題只要10多秒,我的要10分鐘?

時間 2021-06-02 12:36:43

1樓:

用c寫120ms左右

@1.6GHz

inti,j

,k;charn[

10]=,

m[11]

=;chars[

10];j=

0;while(!

n[9])

s[9]

=0;printf_s

("%s",s

);}m[

n[0]]

=-1;

dowhile(m

[n[0

]]>0);

m[n[

0]]=0

;while(n

[j]>9)

while(m

[n[j

]]>j);

}m[n

[j]]=

j;while(j

>0)m[k]

=j;n

[j]=

k;}}

2樓:

人家是10!(全排列),你是10億。

10!是多少?3628800,362萬。

你說這相差有多少嘛~

哥們,論學好高中數學的重要性。

3樓:

"""HAWAII + IDAHO + IOWA + OHIO == STATES

510199 + 98153 + 9301 + 3593 == 621246

"""import itertools

def solve():

num_iter = itertools.permutations(range(10), 9)

for nums in num_iterH, A, W, I, D, O, S, T, E = numsif H == 0 or I == 0 or O == 0 or S == 0continue

if H * 100110 + A * 9201 + W * 1010 + I * 11021D * 1000 + O * 1102 == S * 100001 + T * 10100 + E * 10print(nums)

print(" H, A, W, I, D, O, S, T, E")

solve()

1s左右可以得出結果。

單純只是解決這乙個特例的話,要不了多長時間的。

4樓:juu wiio

自己寫了個python版本

和原書的版本相比,使用regex進行了puzzle的嚴格檢驗,沒有使用eval而是自己構造正確性檢查,考慮那些第一位的字母不可能代表0(計算時間減到了大約1/3)

from itertools import permutations

import regex

puzzle = "HAWAII + IDAHO + IOWA + OHIO == STATES"

word_pattern = "[A-Z]+"

match = regex.fullmatch(r"(?:(?)".format(word_pattern), puzzle)

assert match, "Invalid puzzle"

adder_word_list = match.captures('adder')

sum_word = match['sum']

letters_set = set(''.join(adder_word_list + [sum_word]))

assert len(letters_set) <= 10, 'Too many letters'

nonzero_letters = set(word[0] for word in (adder_word_list + [sum_word]))

nonzero_count = len(nonzero_letters)

letters = list(nonzero_letters) + list(letters_set - nonzero_letters)

adder_dict = {}

for adder in adder_word_list:

for i, c in zip(reversed(range(len(adder))), adder):

adder_dict[c] = adder_dict.get(c, 0) + 10 ** i

sum_dict = {}

for i, c in zip(reversed(range(len(sum_word))), sum_word):

sum_dict[c] = sum_dict.get(c, 0) + 10 ** i

for c, v in sum_dict.items():

adder_dict[c] = adder_dict.get(c, 0) - v

for nonzero_permutation in permutations(range(1, 10), len(letters) - 1):

for i in range(nonzero_count, len(letters)):

all_permutation = nonzero_permutation[: i] + (0, ) + nonzero_permutation[i: ]

if sum(adder_dict[c] * v for (c, v) in zip(letters, all_permutation)) == 0:

print('\n'.join(sorted(൪.format(c, v) for (c, v) in zip(letters, all_permutation))))

print('-' * 30)

5樓:

function

*permutation

(chars

,len

)for

(leti=

0,l=

chars

.length;i

}const

isOK=(

H,A,

W,I,

D,O,

S,T,

E)=>H*

100110+A

*9201+W

*1010+I

*11021+D

*1000+O

*1102

===S

*100001+T

*10100+E

*10;for

(letsof

permutation

('1234567890'

.split(''

),9))}

隨手一寫,跑了6s,python版跑了13s。 @賀師俊 賀老誠不我欺!

update: 更新in-place版本

function

*permutation(a

,size

)for

(leti=

0;i<

size;i

++)else}}

const

isOK=(

H,A,

W,I,

D,O,

S,T,

E)=>H*

100110+A

*9201+W

*1010+I

*11021+D

*1000+O

*1102

===S

*100001+T

*10100+E

*10;for

(letsof

permutation

('1234567890'

.split(''

).map(i

=>+i

),10))}

6樓:

/*HAWAII + IDAHO + IOWA + OHIO == STATES

510199 + 98153 + 9301 + 3593 == 621246

*/console

.time

('test'

)const

LETTERS=[

'A',

'D',

'E',

'H',

'I',

'O',

'S',

'T',

'W']

const

DIGITAL=[

0,1,

2,3,

4,5,

6,7,

8,9]

const

swap=(

arr,i,

j)=>

const

generate=(

arr,

index

)=>LETTERS

.forEach

((letter

,index

)=>)const

=result

const

HAWAII=H

*1e5+

A*1e4

+W*1

e3+A*

1e2+I

*11const

IDAHO=I

*1e4+

D*1e3

+A*1

e2+H*

10+Oconst

IOWA=I

*1e3+

O*1e2

+W*10

+Aconst

OHIO=O

*1e3+

H*1e2

+I*10

+Oconst

STATES=S

*1e5+

T*1e4

+A*1

e3+T*

1e2+E

*10+S

if(HAWAII

+IDAHO

+IOWA

+OHIO

===STATES

)return

}for

(leti=

index

,len

=arr

.length;i

)swap

(arr,i

,index)}

}const

res=

DIGITAL

.forEach

((digital

,index

)=>)console

.log

(res

)console

.timeEnd

('test'

)試了下 900 多毫秒,有兩個結果,其中乙個有個數字首位為0,如果排除就是題主的結果。

7樓:安而遇

仿造python幫你改造了一下,在我的電腦上大概要十幾秒const 滿足等式 = (H, A, W, I, D, O, S, T, E) =>

function range(start, stop, step) ;

function* permutations(iterable = '0123456789', r = 9)}

Python 哪些可以代替遞迴的演算法?

雨落驚風 你想想,遞迴演算法,本質就是數學歸納法 或者,強歸納法 而數學歸納法的遞迴步驟說,我們可以從較小的值通過某個規則 rule 構造出較大的值。所以,就寫個迭代,一步一步的,把f k k n算出來. Python與演算法社群 def fib i,current 0,next 1 if i 0 ...

為什麼很多Python開發者寫GUI不用Tkinter,而要選擇PyQt和wxPython或其他?

catseye 乙個提示解決你所有的疑問 Contents Frameworks libtk8.6.dylib NSDrawerWindow 也就是說你用TK的話,macOS就整體放棄了 至少無法上官方商店,只能自己發布玩兒 全無商業價值 啊啊啊 我習慣先看看官方手冊。上次去看官方推薦的手冊 htt...

用Python寫的方法,為什麼執行時間這麼長?

因為某些編譯型語言 如C 的編譯器有尾遞迴優化,所以遞迴演算法效率並不低。但是python並沒有尾遞迴優化。關於尾遞迴可以參考這個 什麼是尾遞迴?程式設計 至於Python如何引入尾遞迴,有乙個增強函式式程式設計特性的模組可以引用,可以參考丁來強之前在Pyconn china 2015上的講義內容 ...