問題描述:
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的寫入乙個檔案,將...