程式設計珠璣之第二章習題7

2021-06-28 04:31:04 字數 3074 閱讀 3045

問題描述:

7. 在20世紀60年代早期,vic vyssotsky與乙個程式設計師一起工作,該程式設計師需要轉置乙個儲存在磁帶上的4000x4000的矩陣(每條記錄的格式相同,為數十個位元組)。

他的同事最初提出的程式需要執行50個小時。vyssotsky如何將執行時間減少到半個小時呢?

問題解析:

1、首先應該知道什麼是轉置矩陣?

2、這裡的「每條記錄」說的是的矩陣裡的每乙個數。

解決方案:

解決方案1:

作者給出的解答是:為每條記錄插入列號和行號,然後呼叫系統的磁帶排序程式先按列排序再按行排序,最後使用另乙個程式刪除列號和行號。

我這裡依照這個思路,實現了乙個類似的**,當然這裡僅僅是演示原理而已!**如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

#include

#include

// qsort

#include

// strlen

#include

// assert

#define     matrixlen   

8// 矩陣長度

#define error( str )         fatal_error( str )

#define fatal_error( str )   fprintf( stderr, 

"%s\n", str ), exit( 

1 )typedef

struct  data;

data matrix[matrixlen*

2] = ;

int datacomp1(

const

void* a, 

const

void* b)

int datacomp2(

const

void* a, 

const

void* b)

int main()

printf(

"請輸入乙個矩陣:\n");

// 從檔案中讀取資料

data data;

int index = 

0, cur_row = 

0, cur_column = 

0;while(fscanf(rfile, 

"%d", &data.value) != eof)

data.row = cur_row;

data.column = cur_column++;

matrix[index++] = data;

}

// 列排序

qsort(matrix, matrixlen * 

2, sizeof(data), datacomp2);

// 行排序(列相等情況下)

for (

int i = 

0; i 

2; i += 

4)printf(

"該矩陣的轉置矩陣是:\n");

// 列印

for (

int i = 

0; i 

2; i++)

printf(

"%d\t", matrix[i].value);

}

return

0;

}

假設matrix.txt 的值是:

輸出結果如下:

心得疑惑:

1、通過此題又重新複習了轉置矩陣的概念,加深了對qsort的認識。

2、轉置矩陣有哪些用處呢?

程式設計珠璣之第二章習題2

問題描述 給定包含4 300 000 000個32位整數的順序檔案,如何找出乙個至少出現兩次的整數?問題解析 1 假設4 300 000 000個32整數的順序是隨機的。2 給定的32位整數的個數是4 300 000 000大於2 32 1,如果其中沒有任何乙個缺失的32整數,那麼重複整數個數就是 ...

程式設計珠璣第二章

a題給定乙個最多包含40億個隨機排列的32位整數的順序檔案,找出乙個不在檔案中一32位整數。1 在檔案中至少存在這樣乙個數?2 如果有足夠的記憶體,如何處理?3 如果記憶體不足,僅可以用檔案來進行處理,如何處理?答案 1 32位整數,包括 2146473648 2146473647,約42億個整數,...

程式設計珠璣第二章總結

分析 如果記憶體足夠的話,可以採取第一章的點陣圖排序法,以o n 的效率就可以解決。如果記憶體不足的話,但是有幾個外部檔案可以儲存資料,那麼就可以採用二分查詢的思想來解決問題 這裡的思路比較巧妙,它不是通常意義上的二分查詢,但是思維模式很相似.我們可以通過掃瞄輸入檔案,將第一位是0的寫入乙個檔案,將...