日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java约瑟夫环迭代器_Josephus约瑟夫环问题的不同实现方法与总结

發布時間:2024/7/23 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java约瑟夫环迭代器_Josephus约瑟夫环问题的不同实现方法与总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

/************************************************************************/

/*? ? ? ? ? ? ? ? ? Josephus問題——數組實現? ? ? ? ? ? ? ? ? ? ? ? ? */

/************************************************************************/

#include

#include

int Josephus(int times, int number, int id){

int *a;

int i, count = 0, t = 0;

a = (int *)malloc(sizeof(int) * number);

for(i = 0; i < number; i++)

a[i] = i + 1;? ? ? ? ? ? // 數組a用于儲存每個元素的編號

i = id - 1;

while(count < number - 1){

if(a[i] != 0)

t++;

if(t == times){

t = 0;

count++;

printf("%4d", a[i]);

a[i] = 0;? ? ? ? ? ? ? ? // 當該元素被剔除時,該數組元素置為0

}

i++;

if(i == number)

i = 0;

}

for(i=0;i

if(a[i]!=0)

{

printf("\n最后剩余的結點是:%4d\n",a[i]);

return;

}

}

int main(){

int times, number, id;

printf("請輸入總人數:");

scanf("%d", &number);

printf("請輸入報數周期:");

scanf("%d", &times);

printf("請輸入開始報數的編號:");

scanf("%d", &id);

Josephus(times, number, id);

return 0;

}

/************************************************************************/

/* 總結:

優點為可以得出每次被剔除的元素編號

缺點為內存空間占用較大,沒有數學歸納法快速? ? ? ? ? ? ? ? ? ? ? ? */

/************************************************************************/

/************************************************************************/

/*? ? ? ? ? ? ? ? ? Josephus問題——循環鏈表實現? ? ? ? ? ? ? ? ? ? ? */

/************************************************************************/

#include

#include

typedef struct LNode

{

int data;

struct LNode *next;

}LNode,*Linkhead;

void Josephus(int m,int n,int k)

{

Linkhead p,r,head = NULL;

int i;

for(i = 1;i <= n;i++)

{

p = (Linkhead)malloc(sizeof(LNode));//申請一個新的鏈結點

p->data = i;//存放第i個結點的編號

if(head == NULL)

head = p;

else

r->next = p;? ? ? // 因為Insert和Del操作都需要之前一個節點的地址,故用r來存儲。其作用類似棧的top

r = p;

}

p->next = head;//至此,建立一個循環鏈表

p = head;

for(i = 1;i < k;i++)

{

r=p;

/*請注意,此行不是多余的,因為當k!=1,但m=1時如果沒有這條語句,此時刪除動作無法完成*/

p=p->next;

}? ? ? ? //此時p指向第1個出發結點

while(p->next != p)

{

for(i = 1;i < m;i++)

{

r = p;

p = p->next;

}? ? ? ? ? ? ? ? ? ? ? ? //p指向第m個結點,r指向第m-1個結點

r->next = p->next;? ? ? ? //刪除第m個結點

printf("%4d",p->data);? ? //依次輸出刪除結點的編號

free(p);? ? ? ? ? ? ? ? //釋放被刪除結點的空間

p = r->next;? ? ? ? ? ? //p指向新的出發結點

}

printf("\n最后剩余的結點是:%4d\n",p->data);//輸出最后一個結點的編號

}

int main(){

int times, number, id;

printf("請輸入總人數:");

scanf("%d", &number);

printf("請輸入報數周期:");

scanf("%d", &times);

printf("請輸入開始報數的編號:");

scanf("%d", &id);

Josephus(times, number, id);

return 0;

}

/************************************************************************/

/* 總結:

優點為可以得出每次被剔除的元素編號

缺點為相較數組方法需要更多的計算量

總體而言與數組方法相差無幾? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? */

/************************************************************************/

/************************************************************************/

/*? ? ? ? ? ? Josephus問題——數學歸納法直接計算? ? ? ? ? ? ? ? ? ? ? */

/************************************************************************/

#include

int main() {

int answer = 0;

int times, number, i, id;? ? // number為環內總元素個數,times為報數周期, id為從第幾個元素開始報數

printf("請分別輸入總人數和循環次數:");

scanf("%d %d", &number, &times);

printf("起始報號者的編號:");

scanf("%d", &id);

for(i = 1; i <= number; i++) {

answer = (answer + times) % i;? ? ? // 核心算法,利用數學歸納法得出

}

if(answer + id == number)

printf("Survial: %d\n", number);? ? // 防止當幸存者為最后一個編號時輸出0的情況

else

printf("Survival: %d\n",(answer + id) % number);

// 這邊利用number對answer進行取余操作以防止編號數值超過最大編號(溢出)

return 0;

}

對于Josephus問題有兩個地方是可以進行優化的。 (總人數為N,編號為從0~N-1;經過M次報數去除一個成員,剩余成員個數為numleft, 記M%numleft為mPrime)

1、被移除的成員離上一個成員之間的距離是M%numleft-1(報數次為M%numleft).當M大于N時,該計算方式將節省大量時間

2、當mPrime大于numleft的時候可以反向遍歷該表來查找要去除的成員。這樣可以節省時間。同樣這也就要求了該表必須是一個雙向表才行。(即含有Previous方法)

該算法實現原理即為:

第一輪,必定為編號M%N-1的成員被去除,第二輪為在第一輪的基礎上即從編號為M%N的成員開始正移mPrime-1個單位(或者反移numleft-mPrime-1個單位)。若將M%N即為編號0,開始重新編號,那么第二輪被刪除的成員編號便是M%(numleft)-1,由此可得該輪要被刪除的成員與上一輪去除成員之間的距離為M%numleft,這里可利用迭代器來實現。

這里我們便可以得到成員編號與該輪成員數目的關系是:(n表示該輪所剩余的成員數目,Index(n)表示該輪成員的編號(從0開始))

Index(n) = (Index(n - 1) + m) % n。

那么按照這個過程,我們這樣一直移除元素下去,肯定能夠找到最后一個被移除的元素。

這個元素則對應只有一個元素的環,很顯然,它的值為0。也就是Index(1) = 0。

對于這個元素的索引,它對應兩個元素的索引是多少呢?

按照前面的過程,我們倒推回去就是了。Index(2) = (Index(1) + m) % 2。

那么對應3個,4個元素的呢?我們這樣一路繼續下去就可以找到對應到n個元素的索引了。

所以,我們發現了一個有意思的數學歸納關系:

f(1) = 0,? f(n) = (f(n - 1) + m) % n。

按照這個關系,我們可以得到最后一個被取出來的元素對應到n個元素的環里的索引值。

至此,我們可以發現,利用count計數從而刪除成員的方法與此相比起來遜色不少,故之后我們將采用此方法來解決問題。

該問題的最終解決程序可參見另一篇文章: Java實現 Josephus約瑟夫環問題? http://www.linuxidc.com/Linux/2017-05/144055.htm

總結

以上是生活随笔為你收集整理的java约瑟夫环迭代器_Josephus约瑟夫环问题的不同实现方法与总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91精品综合久久久久久 | 国模二区 | 六月婷婷在线观看 | 国产人妻一区二区三区四区五区六 | 亚洲熟女乱色综合亚洲小说 | 麻豆福利在线 | 黄色小说视频网站 | 久久久久久久极品内射 | 手机看片福利视频 | 日韩欧美一区二区三区在线 | 欧美老女人性生活视频 | 欧美福利电影 | 人妻精品久久久久中文字幕69 | 亚洲人人精品 | a天堂中文在线观看 | 久久成人在线观看 | 中文字幕在线视频免费 | 777色婷婷| 色综合网址 | 丰满少妇被猛烈进入高清播放 | 国产精品久久久久影院老司 | 日本啪啪啪一区二区 | 91视频最新入口 | 狠狠干影视 | 日本少妇色 | 初尝情欲h名器av | 久久女同互慰一区二区三区 | 婷婷中文字幕在线 | 国产深夜福利在线 | 免费毛片看 | 91干干| 中文字幕在线观看视频一区二区 | 日韩午夜激情视频 | 天堂资源在线 | 黄色片国产| 男人透女人免费视频 | 在线性视频| 国产美女永久免费无遮挡 | 成 人片 黄 色 大 片 | 亚洲色图吧 | 一级片av | 人妖ts福利视频一二三区 | 天堂影院一区二区 | 欧美一二三| 一级日韩片 | 国产激情视频在线播放 | 日韩特级 | av手机天堂 | 欧美激情69 | 国产高清在线 | 奇米狠狠| 欧美一区二区三区久久综合 | 日韩大片在线 | 手机在线亚洲 | 日韩视频在线观看免费视频 | 亚欧视频在线观看 | 中文字幕观看在线 | 尤物在线精品 | 国产精品v | 天天超碰| 久久久无码一区二区三区 | 国产中出 | 日剧大尺度床戏做爰 | 开心春色激情网 | 激情视频一区二区三区 | 国产精品无码中文字幕 | 无码精品国产一区二区三区免费 | 女人18毛片毛片毛片毛片区二 | 91久久超碰 | 野花成人免费视频 | 动漫美女舌吻 | 欧洲一二三区 | 欧美区在线| 国产精品毛片久久 | 大地资源高清播放在线观看 | 婷婷丁香一区二区三区 | 日本欧美成人 | 久久久一级黄色片 | 中文字幕精品国产 | 亚洲一区在线免费 | 男生操女生网站 | 中文字幕日韩亚洲 | 亚洲色大成网站www www.97ai.com | av一级黄色片 | 无遮挡又爽又刺激的视频 | 视频一区在线免费观看 | 破处视频在线观看 | 草草地址线路①屁屁影院成人 | 成人免费短视频 | 亚洲精品日韩欧美 | 综合在线一区 | 亚洲最大福利网站 | 三级理伦 | 99在线观看免费视频 | 91制服诱惑 | 国产精品xx | 久久av在线 | 一区二区三区伦理片 | 免费在线观看a级片 |