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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

约瑟夫问题-学习笔记

發(fā)布時間:2025/7/25 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 约瑟夫问题-学习笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

約瑟夫問題簡介

據(jù)說著名猶太歷史學家Josephus有過以下的故事:在羅馬人占領(lǐng)喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人 開始報數(shù),每報數(shù)到第3人該人就必須自殺,然后再由下一個重新報數(shù),直到所有人都自殺身亡為止。然而Josephus 和他的朋友并不想遵從,Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,于是逃過了這場死亡游戲。

約瑟夫問題算法分析

明顯只要找到剩余最后兩個位置,就可以逃脫。因此該題就是求解自殺順序。

解法1:循環(huán)鏈表

根據(jù)問題很容易聯(lián)想到循環(huán)鏈表。它的時間復雜度也很容易分析:每查找3次要有一人自殺,一共41人,就要查找41次。時間復雜度O(m*n)。(剛開始學JavaScript,就用js來寫代碼了)

function NodeData(i) {this.data = i;this.next = null; }function createList(n) {var fnode = new NodeData(1);var beginNode = fnode;for (let i = n; i > 1; i--) {let node = new NodeData(i);node.next = fnode;fnode = node;}beginNode.next = fnode;return beginNode; }function josephus(nodeList, n, m) {var currentNode = new NodeData(0);currentNode.next = nodeList;var node = currentNode.next;var indexArray = [];while(indexArray.length < n-1) {for (let i = 1; i < m; i++) {node = node.next;currentNode = currentNode.next; }indexArray.push(node.data);currentNode.next = node.next;node.next = null;node = currentNode.next;}indexArray.push(node.data);return [node.data, indexArray]; } 復制代碼
解法2:根據(jù)規(guī)律推到公式

當有5個人,找第三個時:n=5,m=3

0 1 2 3 4

第一輪刪除index=3的人,剩4個人時順序:

3 4 0 1

按照這個順序繼續(xù)往下刪index=3的人,直到剩余一人。

此時看下n=4,m=3時,人的排序:

0 1 2 3

此時看下2和3行,他們都只有4個人,那此后要刪除的人的順序也就是index是完全相同,完全相互對應(yīng)的。因此剩余的最后一個人也是相互對應(yīng)的。再看下每組相互對應(yīng)的數(shù)據(jù)之間的關(guān)系:

x -> (x+m) mod (n+1)

如:2->((2+3)% (4+1) = 0 )。這下就可以得出:求解 m個人時最后一個被殺的人的結(jié)果同求解m-1個人時最后一個被殺的人的結(jié)果的關(guān)系是:

f(n) = (f(n-1) + m) mod n

因此,知道了n-1的結(jié)果就可以求n的結(jié)果了。用代碼實現(xiàn):

function josephus(n, m) {var lastResult = 0; // 1個人時for(let i = 2; i <= n; i++) {lastResult = (lastResult + m) % i; // 當i個人時}return lastResult; } 復制代碼

注意:此種方式僅適用于index從0開始,且只能求解最后一個人。

時間復雜度O(n),空間復雜度O(1)。

其余解法待補充。

轉(zhuǎn)載于:https://juejin.im/post/5bd179056fb9a05d0e2ea78e

總結(jié)

以上是生活随笔為你收集整理的约瑟夫问题-学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。