當前位置:首頁 » 操作系統 » 有趣的演算法

有趣的演算法

發布時間: 2022-01-27 03:49:10

① 一個有趣的演算法問題。

很有趣,討論一下吧:
先隨機放個A,
將它的周圍8個位置編號1,2,3,4,5,6,7,8
從1號到8號依次放樓,能放D就放D,不能就放C,C還不能就放B,
然後再以已放好的這九個為中心,放它周圍的16個,
按相同的規則編號,然後放樓。
這樣繼續下去,直到放完。
如果碰到邊界,也沒關系,把除去邊界部分編號處理。
這里有三個不確定的問題:
1、隨機放和指定地方放,結果相同嗎?
(可以調試測出)
2、先放A和先放B,C,D結果相同嗎?
(也可以調試測出)
3、按這個路徑擴展結果是不是最好的,還是按其他路徑擴展會更好。
(找幾條路徑試試)

② 除了經典和常用的排序演算法外,還有哪些奇葩而有趣的排序演算法

排序演算法有:
冒泡排序(bubble sort) — O(n^2)
雞尾酒排序(Cocktail sort,雙向的冒泡排序) — O(n^2)
插入排序(insertion sort)— O(n^2)
桶排序(bucket sort)— O(n); 需要 O(k) 額外空間
計數排序(counting sort) — O(n+k); 需要 O(n+k) 額外空間
合並排序(merge sort)— O(nlog n); 需要 O(n) 額外空間
原地合並排序— O(n^2)
二叉排序樹排序 (Binary tree sort) — O(nlog n)期望時間; O(n^2)最壞時間; 需要 O(n) 額外空間
鴿巢排序(Pigeonhole sort) — O(n+k); 需要 O(k) 額外空間
基數排序(radix sort)— O(n·k); 需要 O(n) 額外空間
Gnome 排序— O(n^2)
圖書館排序— O(nlog n) with high probability,需要 (1+ε)n額外空間
不穩定的
選擇排序(selection sort)— O(n^2)
希爾排序(shell sort)— O(nlog n) 如果使用最佳的現在版本
組合排序— O(nlog n)
堆排序(heapsort)— O(nlog n)
平滑排序— O(nlog n)
快速排序(quicksort)— O(nlog n) 期望時間,O(n^2) 最壞情況; 對於大的、亂數列表一般相信是最快的已知排序
Introsort— O(nlog n)
Patience sorting— O(nlog n+ k) 最壞情況時間,需要 額外的 O(n+ k) 空間,也需要找到最長的遞增子串列(longest increasing subsequence)
不實用的
Bogo排序— O(n× n!) 期望時間,無窮的最壞情況。
Stupid sort— O(n^3); 遞歸版本需要 O(n^2) 額外存儲
珠排序(Bead sort) — O(n) or O(√n),但需要特別的硬體
Pancake sorting— O(n),但需要特別的硬體
stooge sort——O(n^2.7)很漂亮但是很耗時

③ 有哪些有趣而且神奇的按位運算

1) 判斷int型變數a是奇數還是偶數
a&1 = 0 偶數
a&1 = 1 奇數
(2) 取int型變數a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1 (先右移再與1)

(3) 將int型變數a的第k位清0,即a=a&~(1<<k) (10000 取反後為00001 )

(4) 將int型變數a的第k位置1,即a=a|(1<<k)

(5) int型變數循環左移k次,即a=a<<k|a>>16-k (設sizeof(int)=16)

(6) int型變數a循環右移k次,即a=a>>k|a<<16-k (設sizeof(int)=16)

(7)整數的平均值
對於兩個整數x,y,如果用 (x+y)/2 求平均值,會產生溢出,因為 x+y 可能會大於INT_MAX,但是我們知道它們的平均值是肯定不會溢出的,我們用如下演算法:
int average(int x, int y) //返回X、Y的平均值
{
return (x & y) + ( (x^y)>>1 );
}

(8)對於一個數 x >= 0,判斷是不是2的冪。
boolean power2(int x)
{
return ( (x&(x-1))==0) && (x!=0);
}

(9)不用temp交換兩個整數
void swap(int x , int y)
{
x ^= y;
y ^= x;
x ^= y;
}

(10)計算絕對值
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}

(11)取模運算轉化成位運算 (在不產生溢出的情況下)
a % (2^n) 等價於 a & (2^n - 1)

(12)乘法運算轉化成位運算 (在不產生溢出的情況下)
a * (2^n) 等價於 a<< n

(13)除法運算轉化成位運算 (在不產生溢出的情況下)
a / (2^n) 等價於 a>> n
例: 12/8 == 12>>3

(14) a % 2 等價於 a & 1

(15) if (x == a)
x= b;
else
x= a;
等價於 x= a ^ b ^ x;

(16) x 的 相反數 表示為 (~x+1)

(17)輸入2的n次方:1 << 19

(18)乘除2的倍數:千萬不要用乘除法,非常拖效率。只要知道左移1位就是乘以2,右移1位就是除以2就行了。比如要算25 * 4,用25 << 2就好啦。

④ 有趣的數 求c語言代碼及演算法思路

php">functioncheck($data,$n){
$last0=0;
$first1=0;
$last2=0;
$first3=0;
$num=$data;
echo" ";
for($j=1;$j<=$n;$j++){
#code...
$a=floor($num/pow(10,$n-$j));
if($a>3){
return0;
}elseif(0==$a){
$last0=$j;
}elseif(1==$a){
$first1=(0==$first1)?$j:$first1;
}elseif(2==$a){
$last2=$j;
}elseif(3==$a){
$first3=(0==$first3)?$j:$first3;
}
$num=$num%pow(10,$n-$j);
echo"$a$last0,$first1,$last2,$first3$num ";
}

if($last0>$first1||$last2>$first3){
return0;
}
if(0==$last0||0==$first1||0==$last2||0==$first3){
return0;
}
return$data;
}


functiona($n){
$sum=0;
for($i=pow(10,$n-1);$i<pow(10,$n)-1;$i++){
#code...
$result=check($i,$n);
if(0!=$result){
#code...
$sum++;
// echo$i;
// echo" ";
// echo$result;
if(0==$sum%10){
echo" ";
}
}
}
echo$sum%1000000007;
}

PHP語言寫的,沒有C環境,就把變數名改改就能用

⑤ 哪位能給講個有意思的演算法,除了排序,查找

類似滴滴的最短路徑演算法,你可以用字體中的筆畫順序來給你提供模擬場景。

⑥ 一萬加一萬等於多少,有趣的演算法

這中間有股票分割的部分,你沒有計算上。比如你看到的某些60的股票,可能它的歷史復權價已經高達十幾萬了,這部分數據我沒統計過,只是給你做一個提醒。

⑦ 深度學習演算法的哪些方面比較有趣

根據2012-2017年被引用最多的深度學習論文來看,深度學習目前的研究方向如下

1、基礎性的理解和概括

2、優化訓練

3、卷積神經網路模型研究

4、圖像:分割/目標檢測

5、視頻

6、自然語言處理

7、強化學習/機器人

8、語音/其他領域

⑧ 求一個比較有意思的編程演算法

*問題分析與演算法設計
根據題意可以將解題過程分為三步:
1)計算從1990年1月1日開始至指定日期共有多少天;
2)由於「打魚」和「曬網」的周期為5天,所以將計算出的天數用5去除;
3)根據余數判斷他是在「打魚」還是在「曬網」;
若 余數為1,2,3,則他是在「打魚」
否則 是在「曬網」
在這三步中,關鍵是第一步。求從1990年1月1日至指定日期有多少天,要判斷經歷年份中是否有閏年,二月為29天,平年為28天。閏年的方法可以用偽語句

描述如下:
如果 ((年能被4除盡 且 不能被100除盡)或 能被400除盡)
則 該年是閏年;
否則 不是閏年。
C語言中判斷能否整除可以使用求余運算(即求模)
*程序與程序注釋
#include<stdio.h>
int days(struct date day);
struct date{
int year;
int month;
int day;
};

void main()
{
struct date today,term;
int yearday,year,day;
printf("Enter year/month/day:");
scanf("%d%d%d",&today.year,&today.month,&today.day); /*輸入日期*/
term.month=12; /*設置變數的初始值:月*/
term.day=31; /*設置變數的初始值:日*/
for(yearday=0,year=1990;year<today.year;year++)
{
term.year=year;
yearday+=days(term); /*計算從1990年至指定年的前一年共有多少天*/
}
yearday+=days(today); /*加上指定年中到指定日期的天數*/
day=yearday%5; /*求余數*/
if(day>0&&day<4) printf("he was fishing at that day.\n"); /*列印結果*/
else printf("He was sleeping at that day.\n");
}

int days(struct date day)
{
static int day_tab[2][13]=
{{0,31,28,31,30,31,30,31,31,30,31,30,31,}, /*平均每月的天數*/
{0,31,29,31,30,31,30,31,31,30,31,30,31,},
};
int i,lp;
lp=day.year%4==0&&day.year%100!=0||day.year%400==0;
/*判定year為閏年還是平年,lp=0為平年,非0為閏年*/
for(i=1;i<day.month;i++) /*計算本年中自1月1日起的天數*/
day.day+=day_tab[lp][i];
return day.day;
}
*運行結果
Enter year/month/day:1991 10 25
He was fishing at day.
Enter year/month/day:1992 10 25
He was sleeping at day.
Enter year/month/day:1993 10 25
He was sleeping at day

⑨ 求幾個有趣的演算法,給高中生講計算機入門用的

演算法就用最簡單的來講唄。
最大公約數,最小公倍數。階乘都不錯!

熱點內容
訪問攔截怎麼解除安卓 發布:2024-09-20 17:28:48 瀏覽:275
蘿卜干存儲 發布:2024-09-20 17:21:37 瀏覽:715
蘋果手機如何遷移軟體到安卓手機 發布:2024-09-20 17:21:34 瀏覽:691
查看伺服器ip限制 發布:2024-09-20 16:56:27 瀏覽:389
p搜系統只緩存1頁為什麼 發布:2024-09-20 16:48:51 瀏覽:838
上網的賬號和密碼是什麼東西 發布:2024-09-20 16:31:31 瀏覽:612
安卓手機王者榮耀如何調超高視距 發布:2024-09-20 16:31:30 瀏覽:428
安卓G是什麼app 發布:2024-09-20 16:23:09 瀏覽:81
iphone怎麼壓縮文件 發布:2024-09-20 16:08:18 瀏覽:356
linux查看用戶名密碼是什麼 發布:2024-09-20 16:03:20 瀏覽:744