演算法筆記2 9補充

2021-10-04 18:08:53 字數 2838 閱讀 2009

2.9

.1 cin與cout

讀入多個變數,讀入了int 型變數n、double型變數db、char 型變數c、char 型陣列str:

cin>>n>>db>>c>>str;

如果想要讀入一整行,則需要使用getline函式,

把一整行都讀入char型陣列str[

100]中:

char str[

100]

;cin.

getline

(str,

100)

;而如果是string容器(第6章會介紹),則需要用下面的方式輸入:

string str;

getline (cin,str)

;cout << n <<

"\n"

<< db << endl;

如果想要控制double型的精度,要加上#include 標頭檔案。下面的**會輸出123.46

:cout <<

setiosflags

(ios:

:fixed)

<<

setprecision(2

)<<

123.4567

<< endl;

不推薦讀者使用cin跟cout來進行輸入和輸出,因為它們在輸入/輸出大量資料的情況下表現得非常糟糕,

有時候題目的資料還沒有輸入完畢就已經超時。

因此還是推薦讀者使用c語言的scanf與printf 函式進行輸入/輸出,只有在十分必要的時候

才使用cin與cout

(例如第6章會介紹的string)。

2.9

.2浮點數的比較

1.由於計算機中採用有限位的二進位制編碼,因此浮點數在計算機中的儲存並不總是精確的。

例如在經過大量計算後,乙個浮點型的數3.14在計算機中就可能儲存成3.140000000001

,也有可能儲存成3.139999999999,

這種情況下會對比較操作帶來極大的干擾(因為c/c++中的「==」操作是完全相同才能判定為true

)。 於是需要引入乙個極小數eps來對這種誤差進行修正。

----

----

----

----

2.如果想要使用不等於,只需要

在使用時的equ前面加乙個非運算子「!」即可(

!equ

(a, b)

)。#include

#include

const

double eps=

1e-8

;#define equ(a,b) ((fabs((a)-(b)))<(eps))

intmain()

else

{ printf (

"false");

return0;

>

大於b+eps的數才能判定為大於b (也即a減b大於eps)。

#define more(a,b) (((a)-(b))> (eps))

>=

大於b- eps的數都應當判定為大於等於b (也即a減b大於- eps)。

#define moreequ(a,b) (((a)-(b))>(-eps))

<

小於b- eps的數才能判定為小於b (也即a減b小於eps)。

#define less(a,b)(((a)-(b))<(-eps))

<=

小於或者等於b,因此小於b+eps的數都應當判定為小於等於b (也即a減b小於eps)。

#define lessequla,b) (((a)-(b))<(eps))

3.圓周率π

const

double pi=acos (

-1.0);

把上面的所有核心部分彙總起來就是下面這些**:

const

double eps=le-8;

const

double pi=acos (

-1.0);

#define equ(a,b) ( (fabs((a)-(b)))< (eps) )

#define more (a,b) (((a)-(b))>(eps) )

#define less(a,b) ( ((a)-(b))< (-eps) )

#define moreequ(a,b) (( (a)-(b))> (-eps) )

#define lessequ(a,b) (((a)-(b) )<(eps) )

2.9

.3複雜度1.o

(1)<

o(logn)

<

o(n)

<

o(n^

2)成立。

對1般的oj系統來說,一秒能承

受的運算次數大概是10^7

~10^8,因此o

(n^2

)的演算法當n的規模為1000時是可以承受的,而當

n的規模為100000 時則是不可承受的。

2.例如對某個演算法來說,如果其消耗的最大資料空間是乙個二維陣列,那麼這個演算法的空間復

雜度就是o

(n^2

)。在1般的應用中,1般來說空間都是足夠使用的(只要不開好幾個10

^7以上

的陣列即可,例如int a[

10000][

10000

]的定義就是不合適的),

因此其重要性一般沒有時間複雜度那麼大。另外,0(1

)的空間複雜度是指演算法消耗的空間不隨資料規模的增大而增大。

考慮到空間一般夠用,因此常常採用以空間換時間的策略,

例如4.2節的雜湊法就是一種以空間換時間的高效方法。

排序演算法 筆記 有待補充

常用排序演算法對比 一 內部排序 指待排序記錄存放在計算機隨機儲存器中進行的排序過程 二 外部排序 指待排序記錄的數量很大,以致記憶體一次不能容納全部記錄,在排序過程中尚需對外存進行訪問的排序過程 三 排序方法穩定和不穩定 四 內部排序常用方法 1.插入排序 1 直接插入排序 基本思想 假設待排序的...

排序演算法 補充

對於上次學習借鑑到的大師級的排序演算法,感概良多,從演算法執行的效率上來說,quicksort 不考慮普遍的最環情況,它的速隊的確是排序演算法中的佼佼者。這次的學習到的演算法包括了插入排序 直接插入,折半插入,希爾排序 選擇排序 堆排序 都是各有利弊。基本的演算法實現如下,因為遞迴使用的不是很好,同...

雜湊演算法補充

比如從10000個從小到大排列且不連續數字裡找出8654 普通方法就是用眼瞅,從左到右 運氣好瞅一次,運氣不好瞅一萬次 於是就有了二分法,取出中間的值 左邊的值一定比中間的值小 右邊的值一定比中間的值大 於是找到8654所用的時間大大縮短可以把把文字內容 一串字元計算成一串hash值 一串內容 ha...