問題:
有個鏈表(List),有N個元素,當(dāng)N很大的時候,我們通常想分批處理該鏈表。假如每次處理M條(0<M<=N),那么需要處理幾次才能處理完所有數(shù)據(jù)呢?
問題很簡單,我們需要<N/M>次,這里我們用<>表示向上取整,[]表示向下取整,那么怎么來表示這個值呢?
我們可以證明:
<N/M>=[(N-1)/M]+1 (0<M<=N,M,N∈Z)
不失一般性,我們設(shè)N=Mk+r(0<=r<M),
1)當(dāng)r>0時,
左邊:<N/M>=<(Mk+r)/M>=<k+r/M>=k+<r/M>=k+1
右邊:[(N-1)/M]+1=[(Mk+r-1)/M]+1=[k+(r-1)/M]+1=k+1+[(r-1)/M]=k+1
2)當(dāng)r=0
左邊:<N/M>=k
右邊:[(N-1)/M]+1=[(Mk-1)/M]+1=[(M(k-1)+M-1)/M]+1=[k-1+(M-1)/M]+1=k+[(M-1)/M]=k
命題得證。
有了這個公式,我們在Java代碼里可以這樣計算:
因為'/'是往下取整的。
有個鏈表(List),有N個元素,當(dāng)N很大的時候,我們通常想分批處理該鏈表。假如每次處理M條(0<M<=N),那么需要處理幾次才能處理完所有數(shù)據(jù)呢?
問題很簡單,我們需要<N/M>次,這里我們用<>表示向上取整,[]表示向下取整,那么怎么來表示這個值呢?
我們可以證明:
<N/M>=[(N-1)/M]+1 (0<M<=N,M,N∈Z)
不失一般性,我們設(shè)N=Mk+r(0<=r<M),
1)當(dāng)r>0時,
左邊:<N/M>=<(Mk+r)/M>=<k+r/M>=k+<r/M>=k+1
右邊:[(N-1)/M]+1=[(Mk+r-1)/M]+1=[k+(r-1)/M]+1=k+1+[(r-1)/M]=k+1
2)當(dāng)r=0
左邊:<N/M>=k
右邊:[(N-1)/M]+1=[(Mk-1)/M]+1=[(M(k-1)+M-1)/M]+1=[k-1+(M-1)/M]+1=k+[(M-1)/M]=k
命題得證。
有了這個公式,我們在Java代碼里可以這樣計算:
int nn=(N-1)/M +1
.

因為'/'是往下取整的。