1. 程式人生 > >josephus Problem 中級(使用陣列模擬連結串列,提升效率)

josephus Problem 中級(使用陣列模擬連結串列,提升效率)

問題描述:

在《josephus Problem 初級(使用陣列)》中,我們提出了一種最簡單直接的解決方案。

但是,仔細審視程式碼之後,發現此種方案的效率並不高,具體體現在,當有人出局時,遍歷陣列仍需要對其進行判斷,

這無疑做了無用功,降低了程式碼效率,在人數多時尤其明顯。

解決方案:

當有人出局時,考慮將當前出局的人的前一個人(未出局)的下一個人置為當前出局的下一個人(未出局)。這樣,便確保了每次對counter的增加都是有效的,遍歷到的人都是還沒有出局的。大大提升了程式的效率。這其實運用了連結串列的思想。

程式碼:

#include <stdio.h>
/*total people number*/
#define ALL 100	
/*people leave when count to left_counter*/
#define left_counter 3
/*next Array record the next people's position*/
int next[ALL];

/*init next array*/
void initNext()
{
	int i = 0 ;
	for (i = 0; i < ALL; i++)
	{
		next[i] = (i+1) % ALL;	
	}
}

/*print next array*/
void printNext()
{
	int i = 0;
	for (i = 0; i < ALL; i++)
	{
		printf("%d ", next[i]);
	}
	printf("\n");
}

int main(void)
{
	initNext();
	int left = ALL;		/*init total left number*/
	int counter = 0;	/*init counter*/
	int i = 0;		/*init array index*/
	int prev =  All-1; /*init prev*/
	while (left > 0)
	{
			counter++;
		/*if counter == left_counter , people out, set next[prev] = next[i]
 		  counter = 0
		  left--
		**/
		if (counter == left_counter)
		{
			left--;
			printf("%d is out\n", i+1);
			counter = 0;
			next[prev] = next[i];
			printNext();
		}		
		
		/*change prev, increase index*/
		prev = i;
		i = next[i];
		
	}
	printf("problem finished!\n");
	return 0;
}

相關推薦

josephus Problem 中級使用陣列模擬連結串列提升效率

問題描述: 在《josephus Problem 初級(使用陣列)》中,我們提出了一種最簡單直接的解決方案。 但是,仔細審視程式碼之後,發現此種方案的效率並不高,具體體現在,當有人出局時,遍歷陣列仍需要對其進行判斷, 這無疑做了無用功,降低了程式碼效率,在人數多時尤其明顯。

P1160 佇列安排陣列模擬連結串列

題目描述 一個學校里老師要將班上N個同學排成一列,同學被編號為1~N,他採取如下的方法: 1.先將1號同學安排進佇列,這時佇列中只有他一個人; 2.2~N號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為1~i -1中某位同學(即之前已經

c/c++程式設計題 之 猴子選大王陣列連結串列兩種方法

一群猴子要選新猴王。新猴王的選擇方法是:讓N只候選猴子圍成一圈,從某位置起順序編號為1-N號。從第1號開始報數,每輪從1報到3,凡報到3的猴子即退出圈子,接著又從緊鄰的下一隻猴子開始同樣的報數。如此不斷迴圈,最後剩下的一隻猴子就選為猴王。請問是原來第幾號猴子當選猴王?

一元多項式求和的兩種實現陣列連結串列

一元多項式求和一般都是有兩種實現方式,小編下面就附上我對這兩種方式的理解和實現程式碼。 1.陣列實現。這種方式實現一元多項式加法,是把陣列下標當做一元多項式的指數,在陣列中存放係數。這種方式在實現一元多項是加法是通過遍歷陣列下標來獲取指數資訊,通過指數資訊將係數進行相加。利用陣列在實現一元多項式

陣列模擬連結串列來實現鄰接表結構

void insert(int u, int v) { e[eid].v = v; e[eid].next = p[u]; p[u] = eid++; }   以上是核心程式碼。。 下面舉一個例子::: 這字真好看(qing

UVA11988 Broken Keyboard (a.k.a. Beiju Text)【陣列模擬連結串列

Broken Keyboard (a.k.a. Beiju Text) You're typing a long text with a broken keyboard. Well it's not

資料結構:陣列連結串列的區別陣列連結串列的優缺點 & 陣列連結串列的適用場景

陣列和連結串列是兩種基本的資料結構,他們在記憶體儲存上的表現不一樣,所以也有各自的特點 陣列 一、陣列的特點 1.在記憶體中,陣列是一塊連續的區域 2.陣列需要預留空間

陣列模擬連結串列

1.什麼是陣列模擬連結串列:         陣列模擬連結串列是一個什麼呢?就是在某索引處儲存下一個索引。下面舉例說明:                 不知道大家明白了沒有。如果我上面的陣列定義為a[4],那麼我訪問a[0]時,所獲取的就是下一個位置所對應的索引

陣列模擬連結串列運作!!L2-002. 連結串列去重

給定一個帶整數鍵值的單鏈表L,本題要求你編寫程式,刪除那些鍵值的絕對值有重複的結點。即對任意鍵值K,只有鍵值或其絕對值等於K的第一個結點可以被保留。同時,所有被刪除的結點必須被儲存在另外一個連結串列中。例如:另L為21→-15→-15→-7→15,則你必須輸出去重後的連結串

UVA11988(破損鍵盤) 使用陣列模擬連結串列插入

  開始刷資料結構相關的題了,在筆試和麵試過程中如果要寫出指標形式的連結串列時間上可能不夠。該題很好地訓練了怎麼使用陣列來模擬連結串列   破損的鍵盤(又名:悲劇文字)(Broken Keyboard(a.k.a. Beiju Text), UVa 1198

Python 資料結構與演算法——列表連結串列linked list

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

字典樹Trie樹模板 陣列表示 + 連結串列表示

 陣列模擬,缺點是並不知道要開多大,可能會出現陣列開小導致wrong answer。 對應題目:hdu 1251  #include <iostream> #include <cstdio> #include <cstring> #de

常見的資料結構棧、佇列、陣列連結串列和紅黑樹

(一)棧 棧:stack,又稱堆疊,它是運算受限的線性表,其限制是僅允許在標的一端進行插入和刪除操作,不允許在其 他任何位置進行新增、查詢、刪除等操作。 簡單的說:採用該結構的集合,對元素的存取有如下的特點先進後出(即,存進去的元素,要在後它後面的元素依次取出後,才能取出該元素)。例如,子彈

演算法快學筆記陣列連結串列

1. 說明 當程式需要將資料儲存到記憶體時,計算機會給你一個儲存地址。需要存 儲多項資料時,有兩種基本方式——陣列和連結串列。但它們並非都適用於所有的情形,因此知道它們的特性很重要。本文將對陣列與連結串列的原理與優缺點進行總結。 2. 陣列 使用陣列儲存多個元素的時候,陣列中元素

java-棧、佇列、陣列連結串列、Hash、樹以及集合

引言 在這裡主要介紹一些比較重要的演算法:棧、佇列、陣列、連結串列、Hash、樹以及集合的概念 棧:先進後出 佇列:先進先出,橫向佇列,存入取出 有關棧和佇列的具體儲存資料的過程,可以通過有關圖片進行理解: 連結串列:通過一個鏈子把多個結點(元素)

陣列連結串列等常用資料結構和集合淺解java

簡單理解:多人在操作同一個容器時,每個人修改裡面的元素時其實是複製出來一個新的容器 ,然後在新的容器上進行修改,修改完將新的容器賦給原來容器的引用,而這個過程中很多人在同步做讀取的動作,但是他們讀取的是舊的容器元素,新的內容他們未能取得,這樣就讀寫分離了,不會產生衝突,但是新舊元素不能保持一致。

找出二維陣列中的最長路徑最長連結串列

一個二維陣列 比如 1    2   3   4    5 16 17 18 19  6 15 24 25 20  7 14 23 22 21  8 13 12 11 10  9 找出其中的最長路徑,每次只能向值比自己小的方向走,且每次只能向上或者向右走。 如24為起點:2

C++/C中基於陣列連結串列靜態連結串列

1.用陣列描述的連結串列,即稱為靜態連結串列。在C語言中,靜態連結串列的表現形式即為結構體陣列,結構體變數包括資料域data和遊標CUR。遊標指示器指示其後繼結點在結構陣列中的相對位置(即陣列下標)。

陣列連結串列和樹的演進

我們最常用的資料結構就是樹,最基礎的資料結構是陣列,那麼樹在陣列的基礎上解決了什麼問題?為什麼用樹而不用陣列?下面我們來詳細的剖析一下: 上面的圖是陣列、連結串列和樹的示意圖,可以看到,陣列中的元素沒有指標,單向連結串列有一個指標,雙向連結串列有兩個指標,它們都是表示的順序關係,也就是

判斷連結串列相交若相交求交點。假設連結串列可能帶環

首先我們分析,兩個連結串列是否相交,是否帶環,有以下幾種情況: 求兩個連結串列是否帶環可以分成三個情況: 1.都不帶環,可以轉換成兩個連結串列是否相交的問題。 2.一個帶環,一個不帶環。–>不相交 3.都帶環:    分別求環的入口點     1.入口點