重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
可以稍微改下,預讀兩句歌詞的時間范圍,時間大于第一句的起始點,小于第二句的起始點,那么顯示第一句,
成都創新互聯是專業的漳平網站建設公司,漳平接單;提供成都網站建設、網站制作,網頁設計,網站設計,建網站,PHP網站建設等專業做網站服務;采用PHP框架,可快速的進行漳平網站開發網頁制作和功能擴展;專業做搜索引擎喜愛的網站,專業的做網站團隊,希望更多企業前來合作!
看了你說遞歸的效率低。那么你可以不用的。
給出的方法就是先生成第一個排列,然后每次調用下面的函數給出下一個排列,這樣生成的效率很高,這個函數可以內聯。
這個是很經典的排列組合算法啊?在網上能搜到一大堆。
大概是那種帶指向的移動的算法。我給你搜一個吧。
我找了幾個,這個是我覺得說的比較清楚的,你可以仔細參考一下,看不懂的話再搜點別的好了。。
全排列的算法跟這個不太一樣的。需要有點改動的。
至于語言的話,應該不會有太大問題吧。。basic版的確實比較少,現在我也比較懶不想動手寫。。還是要靠你自己啦。
★生成排列的算法:
比如要生成5,4,3,2,1的全排列,首先找出一個最小的排列12345, 然后依次調用n!次STL算法中的next_permutation()即可輸出所有的全排列情況。所以這種算法的細節就是STL algorithm中next_permutation()的實現機制。詳細的實現代碼,大伙可以參考侯捷的《STL源代碼剖析》,在這里我只說一下我的理解:
1 首先從最尾端開始往前尋找兩個相鄰元素,令第一個元素為*i,第二個元素為*ii,且滿足*i*ii,找到這樣一組相鄰的元素后。
2 再從最尾端開始往前檢驗,找出第一個大于*i的元素,令為*k,將i,k元素對調。
3 再將ii及ii之后的所有元素顛倒排列,此即所求之"下一個"排列。
prev_permutation()算法的思路也基本相同,只不過它們尋找的"拐點"不同,在next_permutation()算法中尋找的是峰值拐點,而在prev_permutation()算法中尋找的是谷值拐點。另外,在第二步中,prev_permutation()要找的是第一個小于*i的元素而不是第一個大于*i的元素。
具體例子,有空再舉,現在時間太晚了:)
★生成組合的算法:
如下面截圖所示,分全組合和r-組合兩種情況。
這里有一段核心代碼:
//--------------------------------------------------------
// Generate next combination (algorithm from Rosen p. 286)
//--------------------------------------------------------
public int[] getNext () {
if (numLeft.equals (total)) {
numLeft = numLeft.subtract (BigInteger.ONE);
return a;
}
int i = r - 1;
while (a[i] == n - r + i) {
i--;
}
a[i] = a[i] + 1;
for (int j = i + 1; j r; j++) {
a[j] = a[i] + j - i;
}
numLeft = numLeft.subtract (BigInteger.ONE);
return a; //這里返回的a數組,存儲的就是下標的排列組合。
}
到這里,也許大伙會有一個疑問,假如要求的不是數字的排列組合,而是字符或字符串的排列組合呢?怎么辦?其實很簡單,你只要拿數組的下標來做排列組合,返回他們下標的排列組合,然后再到原數組中讀取字符串值,就可以輸出全部的排列組合結果。
按照你的說法,應該要用到Ajax,對網頁中播放器插件進行幀聽,然后再對歌詞部分進行處理,百度的Mp3就是這樣做的。
下面就簡單的說一下吧
材料:歌曲、歌曲對應的歌詞(可以是XML,當然也可以是歌詞專用格式lrc,隨便啦,什么文件都可以)、幾條簡單的JS語句
處理:
1、JSP生成網頁的時候,將音樂播放器插件的ID命名為WMA,當然,你可以隨便命名,只是這里便于說明。
2、讀取XML或LRC內容,利用Ajax加載到id為lrc的div中。
并將XML或LRC的每行的歌詞存到數組testmp3中(此數組當然是二維數組,數據組分別播放時間與歌詞內容)
好了,到此,準備工作就做好了,下面就是重點---歌詞同步。
3、相關語句:
一、定義函數getWMAtime
二、利用Interval=setInterval("getWMAtime()",900),意思就是每隔900毫秒調用getWMAtime這個函數,并將其放入Interval中。
如果要用到“上一曲”“下一曲”,可以將其做為了一個函數,
將音樂的地址賦給WMA.URL,用WMA.controls.play();播放,用WMA.controls.stop();停止播放,用WMA.controls.pause();暫停播放。改變了音樂地址后,記得用Ajax載入新的歌詞!
另:
getWMAtime函數的內容為讀取當前詞曲的播放時間
當前的播放時間:WMA.controls.currentPosition;
歌曲總時間:WMA.currentMedia.duration;
讀取當前的時候后,與數組中時間項進行對比,相同(由于其它原因,可能會出現不相同的情況,因此則用“=”)則用Ajax對id為lrc的div進行更改,具體怎么改那就隨便你咯,一般就是改變一下指定行的顏色。
如果前當播放時間==歌曲總時間,那么就用clearInterval(Interval),停止Interval繼續調用。
好了,一個簡單的JS的歌詞同步播放器就完工啦
Function Min(x() as integer,y() as integer) as double
dim i,j,k,a
dim m() as double
dim s() as string
dim mins as string
redim m(ubound(x),ubound(x))
redim s(ubound(x),ubound(x))
for i=1 to ubound(x)-1 '從起始點0點到i點的距離
m(i,0)=((x(i)-x(0))^2+(y(i)-y(0))^2)^0.5
s(i,0)="0-" cstr(i)
next
'從起始點開始經過K個點后到達i點的最短距離m(i,k),s為各點的連線如"0-3-2-1-4"
for k=1 to ubound(x)-2
for i=1 to ubound(x)-1
m(i,k)=10^307
for j=1 to ubound(x)-1
if instr(s(j,k-1),cstr(i))=0 then'避免重復走一點
a=((x(i)-x(j))^2+(y(i)-y(j))^2)^0.5
if a+m(j,k-1)m(i,k) then
m(i,k)=a+m(j,k-1)
s(i,k)=s(j,k-1) "-" cstr(i)
endif
end if
next
next
next
'計算經過各點后到達最后一個點的最短距離
min=10^307
for j=1 to ubound(x)-1
a=((x(ubound(x))-x(j))^2+(y(ubound(x))-y(j))^2)^0.5
if a+m(j,ubound(x)-2)min then
min=a+m(j,ubound(x)-2)
mins=s(j,ubound(x)-2) "-" cstr(ubound(x))
end if
next
msgbox "最短距離:" min vbcrlf "最短路徑:" mins
End function
private sub Command1_Click
dim x(5) as integer
dim y(5) as integer
dim m as double
x(0)=0
y(0)=0
x(1)=40
y(1)=600
......
x(5)=1000
y(5)=1000
m=min(x,y)
End sub