當前位置:首頁 » 操作系統 » 演算法動畫演示

演算法動畫演示

發布時間: 2022-07-23 22:33:57

㈠ 急:求渡口管理問題的演算法和動畫演示

渡口管理問題
題目:
某汽車輪渡口,過江渡船每次只能載10輛車過江。過江車輛分為客車類和貨車類,上船有如下規定:同類車先到先上船,客車先於貨車上渡船,且每上4輛客車,才允許上一輛貨車;若等待客不足4輛,則以貨車代替,若無貨車等待則允許客車都上船。
根據描述設計一個演算法模擬渡口管理。

提示:
初始化,上渡船汽車數量x,上船客車數y,上船貨車數z;討論在上渡船汽車數量小於10的情形:

1 若x<4,客車隊列又非空,將客車隊列的隊頭汽車出隊上渡船。X 和Y增1,否則轉2
2、若Y》=4,或客車隊列為空隊且貨車隊列非空,將貨車隊列的隊頭汽車出隊上渡船。Y=0,X和Z增1,
否則轉3
3、若貨車隊列為空隊且客車隊非空,將客車隊列的隊頭汽車出隊上渡船。X和Y增1,Z=0;否則轉4
4、提示相應錯誤信息並退出程序運行。

#include<queue>
#include<iostream>
#include<sstream>
using namespace std;

int main()
{
queue<string> q_keche, q_huoche;
string input_data, huoche="huoche", keche="keche";
int Max=10;
int k=0,h=0;

while (cin>>input_data)
{
stringstream out;
if (input_data == huoche)
{
cout <<"huoche size before adding: "<<q_huoche.size()<<" ";
out<<(++h);
q_huoche.push(huoche+out.str());
cout <<q_huoche.back()<<" in the queue, total huoche: "<<q_huoche.size()<<" "<<endl;
}
else if (input_data == keche)
{
cout <<"Keche size before adding: "<<q_keche.size()<<" ";
out<<(++k);
q_keche.push(keche+out.str());
cout <<q_keche.back()<<" in the queue, total keche: "<<q_keche.size()<<" "<<endl;
}
else break;

}

cout <<"2 queues info:\nTotal Keche Size: "<<q_keche.size()<<endl
<<"Toatl Huoche Size: "<<q_huoche.size()<<endl;

if ( q_keche.empty() && (!q_huoche.empty()))
while (!q_huoche.empty())
{
cout<<"huoche Size: "<<q_huoche.size()
<<"huoche will load on the ship: "<<q_huoche.front()<<endl;
q_huoche.pop();
--Max;
if (Max<=0){
cout<<"The ship is full. Please wait for next ship!!!\n...\n..\n.\n"
<<"The ship is coming, start loading\n";
Max=10;
}
}
else
{
while ((!q_keche.empty() || !q_huoche.empty()))
{
for (int i=0; !q_keche.empty()&& i<4; i++) {
cout<<"Keche Size: "<<q_keche.size()<<" "
<<q_keche.front()<<" will load on the ship: "<<q_keche.front()<<endl;
q_keche.pop();
cout<<"Keche Sizes after loading: "<<q_keche.size()<<endl;
--Max;
}
if (!q_huoche.empty())
{
cout<<"huoche Size: "<<q_huoche.size()<<" "
<<q_huoche.front()<<" huoche will load: "<<q_huoche.front()<<endl;
q_huoche.pop();
cout <<"huoche Sizes after loading: "<<q_huoche.size()<<endl;
--Max;
}

if (Max<=0){
cout<<"The ship is full. Please wait for next ship!!!\n...\n..\n.\n"
<<"The ship is coming, start loading\n";
Max=10;

}

}
}
}

㈡ 怎麼實現關鍵路徑演算法動態演示

短路徑算簡單由起點層層向外尋找終點種算效率低幾十節點圖沒問題

另外種思路比較適合少量節點圖由計算機預先計算每節點至其節點短路徑存儲資料庫短路徑數據表至於兩條線路走三條線路走問題解決

㈢ 求快速排序演算法動畫演示,誰幫幫忙啊

http://v.youku.com/v_show/id_XMjk2NzI4OTky.html

排序演算法演示, 相信你再也找不到比這個還好的動畫演示了.

㈣ 動畫展示計算機操作系統的頁面置換演算法

這兩種方法都正確,LRU演算法有幾種實現,前一種是基於計數器的,需要統計之前的引用頁,後一種是基於隊列的調度,只調整隊列就能找到最近未使用的頁。 如果是考試的話可以說明一下用了哪種方法,個人感覺第二種方法比較合適 《操作系統概念》第七版·高等教育出版社P286

㈤ 求查找演算法(折半查找法,順序查找法,分別在一個程序里)「動畫演示」程序源代碼,一共兩個源代碼

折半搜索(英語:half-interval search),也稱二分搜索(英語:binary search)、對數搜索(英語:logarithmic search),是一種在有序數組中查找某一特定元素的搜索演算法。

搜索過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組為空,則代表找不到。這種搜索演算法每一次比較都使搜索范圍縮小一半。

折半查找法是效率較高的一種查找方法。假設有已經按照從小到大的順序排列好的五個整數a0~a4,要查找的數是X,其基本思想是: 設查找數據的范圍下限為l=0,上限為h=4,求中點m=(l+h)/2,用X與中點元素am比較,若X等於am,即找到,停止查找;否則,若X大於am,替換下限l=m+1,到下半段繼續查找;若X小於am,換上限h=m-1,到上半段繼續查找;如此重復前面的過程直到找到或者l>h為止。如果l>h,說明沒有此數,列印找不到信息,程序結束。

函數實現如下:

bin_search(intA[],intn,intkey){
intlow,high,mid;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(A[mid]==key)returnmid;
if(A[mid]<key){
low=mid+1;
}
if(A[mid]>key){
high=mid-1;
}
}
return-1;
}
C語言實現代碼
#include<stdio.h>intmain()
{
inta[11]={0,1,2,3,4,5,6,7,8,9,10},min=0,max=10,mid,n;//max為數列長度,a[0]作為第一個數組元素
printf("請輸入您要查找的數: ");
scanf("%d",&n);
while(min+1!=max)
{
mid=(min+max)/2;
if(n>a[mid])min=mid;
elseif(n<a[mid])max=mid;
else
{
printf("輸入的數在數列的第%d位 ",mid);
exit(0);
}
}
if(n==a[max])
{
max+=1;
printf(" 輸入的數在數列的第%d位 ",max);
}
elseif(n==a[min])
{
min+=1;
printf(" 輸入的數在數列的第%d位 ",min);
}
elseif(n!=a[mid])
printf(" 輸入的數不在數列中");
}
Dev-c++實現
#include<stdio.h>
#include<stdlib.h>
voidmain()
{
inta[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,15};
intn,m,top,bot,mid;
top=m=1;//此處修改top=0;m=1;
bot=14;
printf("pleaseinputanumber:");
scanf("%d",&n);
while(top<=bot)
{
mid=(top+bot)/2;
if(n==a[mid])
{
printf("這是第%d個元素的值。 ",mid+1);
m=0;
break;
}
elseif(n>a[mid])
top=mid+1;
elseif(n<a[mid])
bot=mid-1;
}
if(m)
printf("無此數。 ");
system("PAUSE");
return0;
}

順序查找是按照序列原有順序對數組進行遍歷比較查詢的基本查找演算法。

對於任意一個序列以及一個給定的元素,將給定元素與序列中元素依次比較,直到找出與給定關鍵字相同的元素,或者將序列中的元素與其都比較完為止。

函數實現如下:

intsq_search(keytypekeyp[],intn,keytypekey)
{
inti;
for(i=0;i<n;i++)
if(key[i]==key)
returni;//查找成功
return-1;//查找失敗
}

上面只是演算法實現函數,對於動畫部分,自己用moveto,lineto描點劃線的方式實現吧。

㈥ 用Javascript寫排序演算法的動畫演示

1.讓JavaScript暫停下來,慢下來。
JavaScript排序是很快的,要我們肉眼能看到它的實現過程,我首先想到的是讓排序慢下來。 排序的每一個循環都讓它停300ms然後再繼續進行。 怎麼樣才能停下來呢。查了一下JavaScript貌似沒有sleep()這樣的函數。暫停做不到,但是可以想辦法讓實現跟暫停差不多的效果。比如在循環里做一些無關的事情 。
首先嘗試了讓while(true)來一直執行一個空操作。執行一段時間再回到排序邏輯。代碼大致是這樣:
for (var i = 0; i < 3; i++) {
document.writeln(i); //DOM操作
var now = new Date().getTime();
while(new Date().getTime() - now < 3000){}
}

慢是慢下來了。不過太耗資源,排序進行過程中dom並不會有任何改變,直到排序結束, DOM會變成排序好之後的樣子。 但是如果設置斷點一步步執行的時候 又可以看到一步步的排序變化。估計是因為這個操作太耗資源導致瀏覽器下達了一個DOM操作的命令但是一直騰不出資源來進行DOM操作。所以真正DOM操作的時候在js代碼執行結束之後。
所以讓JavaScript排序慢來來還是沒有實現。
另一種讓JavaScript暫停下來的思路:
寫這個文章的時候又想到一種方法來讓JavaScript停下來。 那就是AJAX的同步請求,以及超時操作。 也就是在要停下來的地方放一個AJAX請求,同步請求, 然後設置超時。超時的時間就是我們要暫停的時間。為了避免在到達超時請求之前服務 器就返回了我們的AJAX請求。可以在服務端運行類似 sleep()的程序 。從而保證AJAX不會返回。直接超時然後返回到我們的循環。不過這只是個設想。有興趣的可以去嘗試一下。
2.閉包和定時器。 這種思路不需要讓排序過程慢下來。而是使用閉包緩存排序過程中數組的變化。然後使用setTimeout來確定展示每一個數組狀態的順序。在排序循環中放入類似下面的代碼。
(function(){
var theArr = arr.slice();//當前數組狀態的備份
setTimeout(function(){
bubbleSortDom(theArr);//排序的DOM操作。
},500*timeCount);
timeCount++;//定時器的順序。
})();

不過後來發現這樣子寫的話代碼量會比較大,邏輯有修改的話要修改的地方會有點多。局限性很多,比如要實現排序動畫加快或減慢操作幾乎是很困難的。所以還要另想辦法。
3.緩存排序中的數組狀態。
也就是在排序過程中。將數組的每一輪循環的狀態保存到一個數組。然後再用這個數組依次將排序狀態保存下來。 只需要在排序中加入一句就行。
this.pushHis(arr.slice(),i-1,j,k,temp);

這樣就只需要一個setInterval()就可以了。並且可以很方便的實現動畫的加快與減慢。邏輯也比較好理解 。
問題二:如何實現JavaScript排序動畫的加快與減慢。
我們問題一使用的第三種方法。 得到一個保存了每一步排序狀態的數組arr。 然後我們可以使用一個setInterval()定時器一步步展現排序狀態。 如果要加快速度或減慢速度。就clearInterval(),修改定時器的執行間隔,重新setInterval(),從前一個定時器執行到數組中的位置開始執行。
問題三:對於使用遞歸實現的數組怎麼辦? 不是在原數組上進行操作的怎麼辦?
使用遞歸實現的排序。 可能並沒有在一個數組上進行操作,只是最後返回一個排序好的數組出來。那麼我們要如何獲得排序中的數組的完整狀態呢。
比如快速排序。
最開始不考慮動畫,我的實現是這樣的:
function quickSort(arr){
var len = arr.length,leftArr=[],rightArr=[],tag;
if(len<2){
return arr;
}
tag = arr[0];
for(i=1;i<len;i++){
if(arr[i]<=tag){
leftArr.push(arr[i])
}else{
rightArr.push(arr[i]);
}
}
return quickSort(leftArr).concat(tag,quickSort(rightArr));
}

然後為了考慮動畫,我改寫了它的邏輯,讓它在同一個數組上進行了實現。 其實是在遞歸的時候傳入了當前的的子數組在原數組中的起始位置。從而在原數組上進行了操作。
用了兩種方法來實現方式。在排序邏輯上略有不同。
第一種是先跟遠處的對比。遇到比自己小的放到自己前面去。循環序號+1。比自己大的放到當前排序子數組的最後面去,循環序號不變。直到排列完成。
這種方法的缺點是即使是一個有序數組。它也會重新排。
第二種方法是 除了標記位,再設置一個對比位。 遇到比自己小的,放到前面去,標記位的位置+1,標記位與對比位之間所有的往後面移動一個位置。
遇到比自己大的。標記位不變,對比位+1。
這種方法的缺點是對數組進行的操作太多。優點是對有序數組不會再排。
方式一:
function quickSort(arr,a,b,qArr){

var len = arr.length,leftArr=[],rightArr=[],tag,i,k,len_l,len_r,lb,ra,temp;
if(a == undefined && b == undefined){
a = 0; b= arr.length-1;//初始化起始位置。
}
if(qArr == undefined){
qArr = arr.slice();
}

if((len == 2 && arr[0] == arr[1])||len<2){
return arr;
}

tag = qArr[a];
for (i = 1; i < len;) {
if(qArr[a+i]<=tag){
leftArr.push(qArr[a+i]);
qArr[a+i-1] = qArr[a+i];
qArr[a+i] = tag;
k = a+i;
i++;
}else{
if(leftArr.length+rightArr.length == len-1){
break;
}
temp = qArr[a+i];
qArr[a+i] = qArr[b-rightArr.length];
qArr[b-rightArr.length] = temp;
rightArr.push(temp);
k = a+i-1;
}
this.pushHis(qArr.slice(),a,b,k);
}

len_l = leftArr.length;
len_r = rightArr.length;
if(len_l== 0){
lb = a;
}else{
lb = a+len_l -1;
this.sort(leftArr,a,lb,qArr);
}

if(len_r == 0){
ra = b;
}else{
ra = b + 1 - len_r;
this.sort(rightArr,ra,b,qArr)
}
return qArr
}

方式二:
function quickSort2(arr,a,b,qArr){
var len = arr.length,leftArr=[],rightArr=[],tag,i,j,k,temp,len_l,len_r,lb,ra;
if(a == undefined && b == undefined){
a = 0; b= arr.length-1;//初始化起始位置。
}
if(qArr == undefined){
qArr = arr.slice();
}
if(len<2){
return arr;
}
if(len == 2 && arr[0] == arr[1]){
return arr;
}
tag = qArr[a];
for (i = 1,k = 0; i < len;) {
if(qArr[a+i]>=tag){
rightArr.push(qArr[a+i]);
i++;
}else{
temp = qArr[a+i];
for(j = a+i;j>a+k;j--){
qArr[j] = qArr[j-1];
// this.pushHis(qArr.slice(),a,b,a+k);
}
qArr[a+k] = temp;
leftArr.push(temp);
k++;
i++;
}
this.pushHis(qArr.slice(),a,b,a+k,i-1);
}
len_l = leftArr.length;
len_r = rightArr.length;
if(len_l== 0){
lb = a;
}else{
lb = a+len_l -1;
this.sort(leftArr,a,lb,qArr);
}
if(len_r == 0){
ra = b;
}else{
ra = b + 1 - len_r;
this.sort(rightArr,ra,b,qArr)
}
return qArr;
}

具體的不同下面會有動畫演示。
問題四:動畫的流暢。
排序動畫的DOM操作是很多的很快的。這里我做的優化只是讓每一個排序步驟只涉及一個DOM操作。 全部由JavaScript拼接好,一次替換。類似下面的代碼。
效果圖:

主要實現了:
冒泡排序JavaScript動畫演示
插入排序JavaScript動畫演示
選擇排序JavaScript動畫演示
快速排序JavaScript動畫演示
歸並排序JavaScript動畫演示
希爾排序JavaScript動畫演示

㈦ 畢業設計C語言中若干經典演算法的動態演示軟體設計

唉原來就是這種就是你的畢業論文,不上大學我就能做了。
沒意思,同意樓上,怪不得說cs專業不好找工作,原來都是這樣的水平這樣的論文。

熱點內容
演算法和人性 發布:2025-01-20 03:28:31 瀏覽:473
軟體編程1級 發布:2025-01-20 03:19:39 瀏覽:952
嫁個編程男 發布:2025-01-20 02:51:39 瀏覽:933
掛勞文件夾 發布:2025-01-20 02:44:22 瀏覽:521
寫編程英文 發布:2025-01-20 02:37:50 瀏覽:16
安卓怎麼修改飢荒 發布:2025-01-20 02:20:54 瀏覽:619
android64位開發環境 發布:2025-01-20 01:58:01 瀏覽:262
阿里雲伺服器能搭美國站點 發布:2025-01-20 01:49:34 瀏覽:279
安卓手機壁紙如何更換成動態壁紙 發布:2025-01-20 01:40:27 瀏覽:706
安卓微信簽名在哪裡修改 發布:2025-01-20 01:25:31 瀏覽:110