1. 程式人生 > >資料結構(七)

資料結構(七)

稀疏矩陣三元組(順序結構)

此處有前提

稀疏矩陣有以下特點:

    1.大量數值為0的元素

    2.非零元素分佈沒有規律

這兩點的描述都比較含糊,不夠理性,一般來說是自己把握的。也是因為這兩點特性,所以才能比較自然地理解這種資料結構。

先看執行結果如下:


原始碼如下:

#define ElemType int
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
using namespace std;
typedef struct{
	int i,j;
	ElemType e;
}Triple;//第i行第j列的元素值為e 
typedef struct{
	Triple *data;
	int row,column,tu;//矩陣的行數、列數、和非零元個數 
}SMatrix;
void CreateSMatrix(SMatrix &M){	
	cout<<"輸入矩陣的行數、列數、和非零元個數:"; 
	cin>>M.row>>M.column>>M.tu;
	M.data=(Triple *)malloc((M.tu+1)*sizeof(Triple));// 
	cout<<"輸入非零元的行下標、列下標、值:"<<endl;
	for(int k=1;k<=M.tu;k++)
		cin>>M.data[k].i>>M.data[k].j>>M.data[k].e;
} 
bool TransposeSMatrix(SMatrix M,SMatrix &T){
	if(!M.tu) return false;
	T.row=M.row;T.column=M.column;T.tu=M.tu;
	int num[M.tu+1];	//儲存每一列非零元的個數 
	int cpot[M.tu+1];	//儲存每一列非零元在T.data中的下標 
	for(int k=1;k<=M.tu;k++)	//矩陣下標從1開始 
		num[k]=0;
	for(int k=1;k<=M.tu;k++)	//求M中每一列非零元個數 
		num[M.data[k].j]++;
	cpot[1]=1;
	for(int k=2;k<=M.tu;k++)	//第k列中第一個非零元在T.data中的序號 
		cpot[k]=cpot[k-1]+num[k-1];
	for(int k=1;k<=M.tu;k++){	//M矩陣中按行有序,自上而下轉置即可 
		int temp=M.data[k].j;
		int q=cpot[temp];
		T.data[q].i=M.data[k].j;
		T.data[q].j=M.data[k].i;
		T.data[q].e=M.data[k].e;
		cpot[temp]++;
	}
	return true;
}
void PrintSMatrix(SMatrix M){
	cout<<"\n輸出用正常矩陣表示:\n";
	ElemType A[M.row+1][M.column+1];
	for(int k=1;k<=M.row;k++){
		for(int l=1;l<=M.column;l++){
			A[k][l]=0;
		}
	}
	if(M.tu){
		for(int k=1;k<=M.tu;k++){
			A[M.data[k].i][M.data[k].j]=M.data[k].e;		
		}		
	}
	for(int k=1;k<=M.row;k++){
		for(int l=1;l<=M.column;l++){
			cout<<A[k][l]<<" ";
		}
		cout<<endl;
	}
}
int main(){
	SMatrix M,T;
	CreateSMatrix(M);
	cout<<"\n以下這個矩陣是用來存放倒置後的矩陣,其數值不影響倒置\n"; 
	CreateSMatrix(T);
	TransposeSMatrix(M,T);
	PrintSMatrix(T);
	return 0;
}
這個方法比較值得推薦的原因在於時間複雜度只有O(m+n),(m,n為行列數)。這個方法的一個重要前提是未轉置的三元組是按行有序的,核心就是用一個cpot陣列來記錄每列的元素應該存放的位置,然後根據這些數值來插入即可。

相關推薦

資料結構——樹結構(Tree) 之二叉樹的常用操作

一.鏈式儲存的二叉樹的操作 1.遍歷二叉樹 先序遍歷:根-->左-->右 中序遍歷:左-->根-->右 後序遍歷:左-->右-->根 2.二叉樹結點的查詢  結點的查詢也可以分為先序查詢,中序查詢和後序查詢。方式和遍

資料結構

稀疏矩陣三元組(順序結構)此處有前提稀疏矩陣有以下特點:    1.大量數值為0的元素    2.非零元素分佈沒有規律這兩點的描述都比較含糊,不夠理性,一般來說是自己把握的。也是因為這兩點特性,所以才能比較自然地理解這種資料結構。先看執行結果如下:原始碼如下:#define

資料結構

好,時隔好多好多日,終於到了第7章 圖 了! 1. 填空題 ⑴ 設無向圖G中頂點數為n,則圖G至少有( )條邊,至多有( )條邊;若G為有向圖,則至少有( )條邊,至多有( )條邊。 答案:0,n(n-1)/2,0,n(n-1) 解析:

資料結構二叉樹節點、空指標、刪除葉節點、最大節點數

1、二叉樹節點 程式碼: //二叉樹節點 #include<stdio.h> #include <malloc.h> #include <conio.h> #include<iostream> // typedef int

資料結構線性表

Status GetElem(SqList L, int i, ElemType *e) { if(L.length == 0 || i < 1 || i > L.length)

資料結構之樹

二叉查詢樹查詢插入和刪除的時間複雜度都為O(log N)。但它有個弊端。如果輸入的資料是排序資料,那麼代價巨大,因為樹將只由那麼沒有左(或右)兒子的節點組成。一種解決方法是找平衡條件:任何節點的深度不能過深。最老的一種平衡查詢樹,即AVL樹。另外,較新的方法是放棄平衡條件

重學資料結構、圖

@[Toc] >圖是一種比線性表和樹更為複雜的資料結構。線上性表中,資料元素之間僅有線性關係,每個資料元素只有一個直接前驅和一個直接後繼;在樹形結構中,資料元素之間有著明顯的層次關係,並且每一層中的資料元素可能和下一層中的多個元素(即其孩子結點)相關,但只能和上一層中一個元素(即其雙親結點)相關; 而在

數據結構二叉樹

廣度優先 -1 XML -o 滿二叉樹 nal 如果 數據 中序 定義 特點 特殊的二叉樹 斜樹 顧名思義,其中的結點都只有一個,又分為左斜樹和右斜樹,這時候又有疑惑了,這種數據結構不是有線性表一樣嗎,沒錯,線性表是一種特殊的樹 滿二叉樹 完全二叉樹

數據結構——雙向鏈表

ear opera osi clas link ges 逆序 位置 -o 數據結構(七)——雙向鏈表 一、雙向鏈表簡介 1、單鏈表的缺陷 單鏈表只能從頭結點開始訪問鏈表中的數據元素,如果需要逆序訪問單鏈表中的數據元素將極其低效。 2、雙向鏈表的結構 雙鏈表是鏈表的一種,由節

數據結構兩棧共享空間

編程 行操作 開始 結構 n-1 容量 兩個棧 java語言 語言   一、棧的順序存儲的一個很大的缺陷就是必須事先確定數組存儲空間大小,萬一不夠用了,就要用編程手段來擴展數組的容量,非常麻煩。   二、對於一個棧,也只能盡量考慮周全,設計出合適大小的數組來處理;但是對於兩

數據結構排序---希爾排序

incr 最好的 直接插入排序 增量 www ref 必須 初始 html 圖解排序算法(二)之希爾排序 定義 希爾排序是希爾(Donald Shell)於1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的一個更高效的版本,也稱為縮小增

數據結構排序---排序知識點總結

至少 pla 有序 rdquo 穩定 href 比較 cli tar 回顧:排序分類 (一)插入類 直接插入排序 折半插入排序 希爾排序 本質還是插入排序 (二)交換類 冒泡排序 快速排序 (三)選擇類 簡單選擇排序 堆排序 (四)歸並類

JavaScript 資料結構: 連結串列

前言 從實用性角度來說,連結串列對Javascript 來說沒有任何價值,為什麼呢? 我們先了解連結串列的特性,這個特性我們放在c++前提下來說,因為 這個特性是 根據 記憶體特性 來闡述的,Javascript 不存在記憶體操作,所有資料型別,本質性繼承Object 物件,而Ob

資料結構

***********************特殊的線性表-------棧**************************** 棧: 先進後出、後進先出 棧的插入運算 叫做入棧 棧的刪除運算 叫做出棧 演示程式碼: package com.chapter11; //棧的介面public int

資料結構:線性表

一、線性表及其邏輯結構 1、線性表的定義 線性表是具有相同特性的資料元素的一個有限序列。 該序列中所含的元素個數叫做線性表的長度,用 n表示(n>=0)。當 n=0時,表示線性表是一個空表,即表中不包含任何資料元素。 線性表中的第一個元素叫做表頭元素,最後一

資料結構:演算法及其描述

一、演算法及其描述 1、什麼是演算法 資料元素之間的關係有邏輯關係和物理關係,對應的操作有邏輯結構上的操作功能和具體儲存結構上的操作實現。 把 具體儲存結構上的操作實現方法 稱為演算法。 確切地說,演算法是對特定問題求解步驟的一種描述,它是指令的有限序列,其中每一

資料結構:什麼是資料結構

一、什麼是資料結構 1、資料結構的定義 資料:從計算機的角度來看,資料是所有能被輸入到計算機中且能被計算機處理的符號的集合。它是計算機操作的物件的總稱,也是計算機處理資訊的某種特定的符號表示形式(二進位制碼的抽象表示?)。 資料元素:資料元素是資料中的一個個體

20172309_《程式設計與資料結構》_課堂測試修改報告。

20172309_《程式設計與資料結構(下)》_課堂測試修改報告。 課程:《程式設計與資料結構》 班級:1723 姓名: 王志偉 學號:20172309 實驗教師:王志強老師 實驗日期:2018年6月13日 必修/選修: 必修 實驗內容: 查詢演算法綜合示例: 實驗過程及結果

資料結構之棧

棧是後進先出,先進後出 棧是一種受限制的線性表,只允許一端插入和刪除資料。 棧的實現也有兩種,用陣列實現叫順序棧;用連結串列實現叫鏈式棧。 // 基於陣列實現的順序棧 public class ArrayStack { private String[] items; // 陣列 private i

大話資料結構——棧的兩種java實現方式

在我們生活當中經常會看到這樣一種操作,比如我們往一個空羽毛球盒子裡面放羽毛球(個人比較喜歡羽毛球,嘿嘿),放完後再將羽毛球一個一個取出的時候會發現,最先放進去的羽毛球往往最後才取出來,相反,最後放入的羽毛球往往最先取出。這個例子形象的說明了棧的操作方式,下面我們來看看什麼是棧,以及棧的一些操