A. 請問資料庫里的層次模型、網狀模型、關系模型之間的比較
1.層次模型
層次模型是資料庫系統中最早使用的模型,它的數據結構類似一顆倒置的樹,每個節點表示一個記錄類型,記錄之間的聯系是一對多的聯系,基本特徵是:
* 一定有一個,並且只有一個位於樹根的節點,稱為根節點;
* 一個節點下面可以沒有節點,即向下沒有分支,那麼該節點稱為葉節點;
* 一個節點可以有一個或多個節點,前者稱為父節點,後者稱為子節點;
* 同一父節點的子節點稱為兄弟節點。
* 除根節點外,其他任何節點有且只有一個父節點;
圖11.7是一個層次模型的例子。
層次模型中,每個記錄類型可以包含多個欄位,不同記錄類型之間、同一記錄類型的不同欄位之間不能同名。如果要存取某一類型的記錄,就要從根節點開始,按照樹的層次逐層向下查找,查找路徑就是存取路徑。如圖11.8所示。
層次模型結構簡單,容易實現,對於某些特定的應用系統效率很高,但如果需要動態訪問數據(如增加或修改記錄類型)時,效率並不高。另外,對於一些非層次性結構(如多對多聯系),層次模型表達起來比較繁瑣和不直觀。
2.網狀模型
網狀模型可以看作是層次模型的一種擴展。它採用網狀結構表示實體及其之間的聯系。網狀結構的每一個節點代表一個記錄類型,記錄類型可包含若干欄位,聯系用鏈接指針表示,去掉了層次模型的限制。網狀模型的特徵是:
1. 允許一個以上的節點沒有父節點;
2. 一個節點可以有多於一個的父節點;
例如,圖11.9(a)和圖11.9(b)都是網狀模型的例子。圖11.9(a)中節點3有兩個父節點,即節點1和節點2;圖11.9(b)中節點4有三個父節點,即節點1,節點2和節點3。
由於網狀模型比較復雜,一般實際的網狀資料庫管理系統對網狀都有一些具體的限制。在使用網狀資料庫時有時候需要一些轉換。例如,如圖11.10所示。
網狀模型與層次模型相比,提供了更大的靈活性,能更直接地描述現實世界,性能和效率也比較好。網狀模型的缺點是結構復雜,用戶不易掌握,記錄類型聯系變動後涉及鏈接指針的調整,擴充和維護都比較復雜。
3.關系模型
關系模型是目前應用最多、也最為重要的一種數據模型。關系模型建立在嚴格的數學概念基礎上,採用二維表格結構來表示實體和實體之間的聯系。二維表由行和列組成。下面以教師信息表和課程表為例,說明關系模型中的一些常用術語:
表11.1 教師信息表(表名為:tea_info)
TNO(教師編號)
NAME(姓名)
GENDER(性別)
TITLE(職稱)
DEPT(系別)
805
李奇
女
講師
基礎部
856
薛智永
男
教授
信息學院
表11.2 課程表(表名為:cur_info)
CNO(課程編號)
DESCP(課程名稱)
PERIOD(學時)
TNO(主講老師編號)
005067
微機基礎
40
805
005132
數據結構
64
856
1. 關系(或表):一個關系就是一個表,如上面的教師信息表和課程表。
2. 元組:表中的一行為一個元組(不包括表頭)。
3. 屬性:表中的一列為一個屬性。
4. 主碼(或關鍵字):可以唯一確定一個元組和其他元組不同的屬性組。
5. 域:屬性的取值范圍。
6. 分量:元組中的一個屬性值。
7. 關系模式:對關系的描述,一般表示為:關系名(屬性1,屬性2,... ...,屬性n)。
關系模型中沒有層次模型中的鏈接指針,記錄之間的聯系是通過不同關系中的同名屬性來實現的。 關系模型的基本特徵是:
1. 建立在關系數據理論之上,有可靠的數據基礎;
2. 可以描述一對一,一對多和多對多的聯系。
3. 表示的一致性。實體本身和實體間聯系都使用關系描述。
4. 關系的每個分量的不可分性,也就是不允許表中表。
關系模型概念清晰,結構簡單,實體、實體聯系和查詢結果都採用關系表示,用戶比較容易理解。另外,關系模型的存取路徑對用戶是透明的,程序員不用關心具體的存取過程,減輕了程序員的工作負擔,具有較好的數據獨立性和安全保密性。
關系模型也有一些缺點,在某些實際應用中,關系模型的查詢效率有時不如層次和網狀模型。為了提高查詢的效率,有時需要對查詢進行一些特別的優化
B. excel2003數據透視表怎麼用
一、 數據透視表的目的 數據透視表能幫助用戶分析、組織數據。利用它可以很快地從不同角度對數據進行分類匯總。例如:經濟普查數據分鄉鎮、分行業匯總,各種抽樣調查分組分析匯總等。不是所有工作表都有建立數據透視表的必要,記錄數量眾多、以流水帳形式記錄、結構復雜的工作表,為了將其中的一些內在規律顯現出來,可將工作表重新組合並添加演算法。即,建立數據透視表。 例如,有一張經濟普查工作表,欄位(列)多,且記錄(行)數眾多。欄位有法人碼、單位名稱、鄉鎮、行政區劃代碼、行業代碼、固定資產原值、經營稅金、稅費、工資福利支出等。為此,需要建立數據透視表,以便將一些內在規律顯現出來。 二、數據透視表的建立 1、將游標移入需建立數據透視表的工作表中,然後單擊"數據"→"數據透視表和數據透視圖"。 2、"數據透視表和數據透視圖向導-3步驟…"對話框上,選用默認選項,「Microsoft Excel數據清單或資料庫」,單擊"下一步"。 3、在"數據透視表和數據透視圖向導-3步驟…"對話框上,在「選定區域」框中,已經自動選定工作表的(整個)數據區域,單擊"下一步"。 4、在"數據透視表和數據透視圖向導-3步驟之3"對話框上,選用默認選項:"新建工作表",在當前工作的左側創建一個新工作表。這樣做,可以保證原始數據的安全以及可利用性。單擊"完成"後,一張新工作表-「數據表(下圖所示)」即出現在當前工作的左側。 三、數據表中數據的關系 1、數據表上,幾個區域的設定方法 (1)「請將行欄位拖至此處」(相當於「左端標題行」),將作為橫向分類依據的欄位,從「數據透視表」工具欄上拖至此處。例如,將「鄉鎮(街道)」欄位拖至此處。 (2)「請將列欄位拖至此處」(相當於「頂端標題行」),將作為縱向分類依據的欄位,從「數據透視表」工具欄上拖至此處。拖至此處的欄位是計算的「依據」。 (3)「請將數據項拖至此處」(相當於「普通數據區」),將作為統計依據的欄位,從「數據透視表」工具欄上拖至此處。拖入該區中的欄位,Excel將用某種演算法,對其進行計算,然後將計算結果(匯總數值)顯示出來。例如,將「工業總產值」、「本年折舊」欄位拖至此處,即可得到各鄉鎮的求和匯總數。見下圖: (4)「請將頁欄位拖至此處」,將作為分類顯示(篩選)依據的欄位,從「數據透視表」工具欄上拖至此處。 可以將一個或多個欄位拖至此處。此區域中的欄位是分類篩選的「首要」條件。例如,將「縣」欄位拖至此處,然後在其中,選擇「沙縣」,則下方表格中,只統計「沙縣」有關的情況。 提示:「頂端標題行」和「頁欄位」區中,均可有多個欄位。 2、透視分析數據 改變透視表內部的透視關系,從不同的角度查看數據之間的內在關系。主要包括:改變透視關系、添加或刪除項目以及數據更新 (1)改變透視關系 更改各區域中的放置欄位,或改變欄位的分組條件即可以改變透視關系。 添加欄位的方法上面已經介紹過了,刪除方法,是將需刪除欄位拖出數據表區域即可。 改變欄位分組條件的方法:單擊欄位名右側的三角形按鈕,然後單擊下拉式列表菜單上的相應條件 (2)改變統計欄位的演算法 雙擊透視表左上角的統計欄位名,打開」數據透視表欄位「對話框,在「匯總方式」框內,選定所需的演算法,然後單擊「確定」。 (3)透視表的更新 若原工作表中的數據(含標題行-欄位名)更改後,透視表作相應更新的方法: 默認情況下,當重新打開工作薄時,透視表數據將自動更新。 在不重新打開工作薄的情況下,在原工作表的數據更改後,在透視表中單擊「數據透視表」工具欄上的「更新數據」按鈕即可。 提示:普通數據更改後,單擊「更新數據」按鈕後,即可完成更新。若更改了已經拖入透視表中的欄位名,則該欄位將從透視中刪除,需要重新添加。 四、透視圖表 將透視表製作成透視圖表的方法是:單擊「數據透視表」工具欄上的「圖表向導」即可生成一張圖表(位於左側的新工作表上)。 透視圖表的編輯方法,與普通圖表相似。
C. 數據泛化是什麼
06-08-21] 來源: 作者: [字體:大 中 小]
黃建國
(合肥幼兒師范 現代教育技術中心 安徽 合肥 230011 )
摘要 為了更有效的進行在線分類挖掘,提出了一種泛化演算法。該演算法結合了數據立方體技術和面向屬性歸納方法中的泛化策略,有效降低了聚合運算的運算量,提高了運算效率,將資料庫中的原始數據泛化成用戶感興趣的概念層次上的、聚合的、具有統計意義的元數據,為在線分類提供了良好的數據環境。
關鍵詞 數據挖掘 數據泛化 數據立方體
1 引言
數據准備是KDD過程中一個很重要的過程,良好的數據准備過程能夠為數據挖掘提供清潔、可靠、穩定的數據環境,以保證挖掘演算法的有效實施。在線分類理想的數據環境應具備以下幾個特點: (1)數據應包含豐富的屬性信息,應具備可靠性和穩定性;
(2)數據的屬性應具有對於分類任務的相關性。大多數的分類任務只與資料庫中部分屬性有關,多餘的、無關的屬性介入分類,常會減慢甚至錯誤引導分類過程,應此必須去掉無關屬性。
(3)數據應具有高層數據信息,以發現清晰的、高層的、具有統計意義的分類規則。在本文的研究中,為了使數據環境達到上述要求,在數據准備階段採用了數據泛化的策略,這個策略用概念層次作為背景,結合了OLAP技術與Jiawei Han等人的面向屬性歸納的方法,明顯提高了工作效率。
2 面向屬性歸納中的基本泛化策略和演算法
隨著KDD研究的逐步深入, Jiawei Han等人提出了一種基於歸納的知識發現方法——面向屬性的歸納方法[1][2][3],這方法的特點是能夠根據概念層次將低概念層的數據泛化到相應的高層次的概念層,以發現多層的或高層的規則。面向屬性歸納方法是一種有效的、完整的知識發現演算法,該演算法將機器學習中示例學習方法與資料庫的操作技術相結合[1]。演算法的一個關鍵就是攀升屬性所對應的概念層次樹以泛化原始數據集的數據到用戶感興趣的概念層上,減少數據集的大小,從而降低知識發現過程的計算復雜度。面向屬性歸納方法的進行,必須有兩個前提:
(1)必須由用戶提出明確的知識發現任務。在Jiawei Han等人的研究中,採用了一種類似SQL語句的知識發現語句DMQL[4]用來讓用戶定義發現任務,下面便是一個分類任務的語句描述:
要說明的是在本文的研究中採用了一個可視化的向導來引導用戶定義發現任務,但為了文章描述方便,在本文的描述中,借用了DMQL來描述發現任務
(2)與發現任務相關的屬性應有概念層次,如上文所述,數值型的概念層次可以自動提取,給定的概念層次可以用戶的興趣和發現任務的不同而進行動態調整。
在具備以上兩個前提時,面向屬性歸納採用了以下一些泛化策略。
● 泛化策略
策略1 在最小分解單位上泛化
一般而言,泛化都是在數據集的單個屬性上進行的。因為單個屬性常常是數據集中的最小分解單位。在最小分解單位上進行泛化,更能確定泛化過程中的細微變化,從而達到適度泛化的目的,避免過度泛化。
策略2 屬性去除
如果一個屬性在相關數據集中有大量不同的值,但是在其對應的概念層次樹上,沒有比該屬性更高的概念層,則該屬性將被從發現任務中去除。因為這樣的屬性是不可能被泛化到更高的概念層的,這是符合示例學習理論的。
策略3 概念樹攀升
如果一個屬性在概念層次樹上有更高層次的概念,那麼在泛化後的數據集中將所有記錄的該屬性值以高層次的屬性值替代。
策略4 增加屬性CNT
作為策略3的執行結果,必然會有許多不同的紀錄由於屬性值完全相同而合並成一條紀錄。為了反應這一變化,引入屬性CNT來紀錄最初的表中不同紀錄被概括成泛化表中相同紀錄的個數。屬性CNT在泛化的過程中保存了最初的計數,該值在知識發現的過程中起到了重要作用。
策略5 設立閾值
利用策略2中的CNT可以定義規則的正確率P,P=(符合規則的CNT值)/(符合規則左邊屬性條件的CNT值)。這樣可以定義一閾值L用於取捨規則,若P>L則規則有效,否則丟棄該規則。另外,對一個屬性A而言,為了將數據集概括到一定層次,必須沿著A的概念層次向上爬行幾次。為了控制這個過程,有必要設置一歸納閾值,若A的取值個數達到這一閾值,則無需進一步概括,否則必須進行進一步的概括。除此之外,我們還可以對泛化表設置一個歸納閾值,如果泛化表的記錄樹大於該歸納閾值,則進行進一步的泛化直到滿足這個歸納閾值為止。以上策略可以總結成演算法如下:
演算法1 (基本泛化演算法)
輸入條件:1.一個關系數據集,2 一個學習任務,3 一套相關屬性的概念層次,4 每個屬性歸納閾值t[i](i=1 to n,於屬性相對應)、一個泛化表歸納閾值t2。
輸出:一個用戶期望的泛化後的數據集。
步驟:本演算法可以分為兩大步:
Step1. 根據用戶提交的學習任務,從原始的關系數據集中收集與任務相關的屬性與數據。生成初始泛化集GR;
Step2. 運行基本的泛化演算法產生泛化數據集。
注意,step2可以細化成如下演算法:
begin
for GR中的每一個屬性Ai do
begin
while Ai的不同值的數目>t[i] do
begin
if Ai在概念層次中有高層次的概念 THEN
將Ai的所有值以高層次的概念值取代
else
在GR中移去Ai;
合並同樣的記錄;
end;
end;
while GR中的記錄數>t2 do
begin
選擇泛化屬性進一步泛化;
合並相同的記錄。
end;
end.
3 基於數據立方體的泛化演算法
上述泛化演算法是針對關系表的,其生成的結果也是關系數據表。對泛化後關系數據表進行分類規則挖掘時仍要進行大量的聚合運算,如計數、求和等。有沒有辦法降低聚合運算的運算量呢?有,那就是數據立方體。我們知道數據立方體的方格內存放的就是一些聚合值,而且對數據立方體進行聚合運算,其效率遠高於對關系資料庫進行聚合運算。基於此,本文提出了一種基於數據立方體的演算法。
● 基於數據立方體的泛化演算法
本演算法共分為四步:第一步,初始化。首先,根據用戶提出的發現任務,收集相關數據。(這里需說明的一點是此處用戶提出的發現任務的相關屬性實際上是一個維的概念,它可能對應於資料庫中一個或幾個有層次關系的實際屬性。在下面的例子中我們將看到這一點。)然後確定每維的概念層次(自動提取數值型概念層次或動態調整已有概念層次)。第二步,構造基本立方體(Basecube)。這一步中首先根據資料庫的數據分布特性(對於離散屬性確定不同值的個數,連續值則確定數值間的最小間隔)確定每維的最初泛化層次,然後進行聚合計算來構造基本立方體。第三步,按照基本泛化策略對每維進行泛化造作,以確定每維理想的泛化層次。第四步,在新的泛化層次上對Basecube進行再計算,以構造最終的泛化立方體Primecube。這一步中將大量使用數據立方體的操作。該演算法的形式描述如下:
演算法2 基於數據立方體的泛化演算法
輸入:
1 一個待挖掘的關系數據集;
2 一個學習任務;
3 一個概念層次集合Gen(Ai),Ai是任意維;
4 Ti,任意維Ai的泛化閾值。
輸出:一個最終泛化的數據立方體。
方法:
⑴ 始化:
① 根據用戶的學習任務,確定每一維對應的屬性,並從初始關系數據集中收集相關的數據。
② for 每一維Ai do
begin
if Ai是數值型 and Ai沒有概念層次 then 自動生成概念層次(演算法2.1)
else 動態調整概念層次以適應當前學習任務;
end;
⑵ 造Basecube:
① 對於每一維的屬性計算其在資料庫中對應的不同值的個數,如果是數值型則計算數值間的最小間隔,根據不同值的個數或最小間隔確定每一維的最初泛化層次。
② 按最初泛化層次確定每維的維成員,並進行COUNT,SUM等聚合運算。用文[26]中演算法構造基本立方體。
⑶ 確定每維的泛化層次。
① 根據每一維的泛化閾值,進行基本泛化(演算法2.5)找到最終理想的層次Li。
② 找出每一維Ai的映射<v,v』>,其中v是維成員值,v』是v在泛化層上對應的概念值。
⑷ 構造Primecube。
① 將Basecube的維成員v替換成v』;
② 對Basecube進行數據立方體操作,構造Primecube。
本演算法中,第一步的時間復雜度主要依賴於特定資料庫的操作和提取或調整概念層次的演算法的效率。第二步的主要操作在於立方體的構造上,復雜度為 。第三步和第四步都只對基本立方體進行一次掃描,加上計算量,復雜度也為 。所以本演算法中二到四步總的時間復雜度應為 。
下面以一個例子來進一步描述該演算法。
例1:從網上下了一個資料庫CITYDATA,該資料庫記錄了美國地區城市的情況。其中有三個表,如下:
表1 CityLocation 記錄城市所在地
表2 LaborIncome 記錄城市人員的收入
表3 記錄犯罪率與教育程度
我們有一個初始概念層次US_LOCATION:
…
現在我們要對資料庫進行如下任務的發現:
CLASSIFY CITYDATA
ACCORDING TO UNEMPLOYMENT_RATE
IN RELEVANCE TO US_LOCATION,FAMILY_INCOME,POVERTY_PCT,
CRIME_RATE,BACHELOR_PCT
FROM LABORINCOME,CRIMEEDUCATION
注意到該發現任務中的維US_LOCATION對應著幾個有層次關系的資料庫屬性:area-name→county→state→region→big region→country,這些屬性在概念層次Us location中都對應著相應的層次。每一維的閾值為5。
根據演算法,我們首先作初始化,對family income,poverty pct,crime_rate,bachelor_pct由於它們是數值型的屬性,所以概念層次可以自動提取出來,下面便是自動提取出來的概念層次:
運行演算法二、三、四步,得到六維的基本立方體和泛化立方體,為方便起見本文給出其中三維的立方體圖。
最後的泛化結果放在了表4。注意到cityid的屬性已被移去。
表4 最後的泛化結果
4 結束語
數據泛化在線分類研究中佔有重要地位,它是在線分類規則挖掘演算法的基礎。在線分類任務的一個重要特徵就是數據量龐大,且數據中含有一定量的異常信息,這樣的數據是不適合直接分類的。通過數據泛化,可以將數據整理、清潔,為分類提供較好的數據環境。另外數據泛化採用了概念層次技術,可以發現高層的分類規則,從而使分類結果更易理解。
本文結合基本的面向屬性歸納技術,提出了一種數據立方體的數據泛化演算法,給在線分類提供了較好的數據預處理技術。
參考文獻
[1] Han J, Fu Y. Exploration of the power of attribute-oriented inction in data mining. In: Fayyad U M et al eds. Advances in Knowledge Discover and Data Mining. Cambridge: AAAI/MIT Press, 1996. 399~421
[2] J. Han, Y. Cai, and N. Cercone. Knowledge discovery in databases: An attribute_Oriented approach. In Proc. 18th Int. Conf. Very Large Data Bases, pages 547--559, Vancouver, Canada, August 1992.
[3] Cheung D W, Fu A W C, Han J. Knowledge discovery in databases: a rule based attribute oriented approach. In: Zbigniew R ed. Methodologies for Intelligent systems: 8th International Symposium. Berlin: Springer-Verlag, 1994. 164~173
[4] Han, J., Chiang, J., Chee, S., Chen, J., Chen, Q., Cheng, S., Gong, W., Kamber, M., Liu, G., Koperski, K., Lu, Y., Stefanovic, N., Winstone, L., Xia, B., Zaiane, O. R., Zhang, S. & Zhu, H. (1997), DBMiner: A system for data mining in relational databases and data warehouses, in `Proc. CASCON'97: Meeting of Minds', Toronto, Canada, pp. 249--260.
作者簡介:
黃建國(1974年10月-- ) ,男,安徽省合肥市人,合肥幼兒師范學校講師,中國科技大學計算機應用工程碩士。
D. 數據分析的方法有哪些
常用的列了九種供參考:
一、公式拆解
所謂公式拆解法就是針對某個指標,用公式層層分解該指標的影響因素。
舉例:分析某產品的銷售額較低的原因,用公式法分解
可以看到,數據可以被分到紅藍綠三個不同的簇(cluster)中,每個簇應有其特有的性質。顯然,聚類分析是一種無監督學習,是在缺乏標簽的前提下的一種分類模型。當我們對數據進行聚類後並得到簇後,一般會單獨對每個簇進行深入分析,從而得到更加細致的結果。
獲取更多數據分析學習信息及資料,歡迎關注聚數雲海同名公眾號哦~
E. 求資料庫關系運算中差運算的代碼實現
假設關系R和S分別有n和m個元組,
R的序號為i,S的序號為j.
演算法如下:
關於鍵k對兩關系作升序排列;
i=1;j=1;
while in and jm do
比較Ri(k)與Sj(k)
若Ri(k)小,則取Ri;序號i加1;
若Sj(k)小,則序號j加1;
若相等, 則i和j均加1;
endwhile;
若in , 則輸出R的剩餘元組.
演算法簡例:設R與S都僅
有一個屬性(是鍵)。排
序後分別是:
R:1,4,5,6 (n=4)
S:2,4 (m=2)
執行過程是:
i=j=1;
比較1和2,輸出1,i改為2;
比較4和2, j改為2;
比較4和4, i=j=3;
循環停止;
輸出R剩餘元組5,6.
演算法停止.
操作結果:1,5,6.
這個是集合的差演算法,類似於資料庫的。
F. 資料庫和演算法是什麼關系
演算法的范圍很大。 一般應用,數據的存儲都委託給資料庫了。
資料庫是一種應用軟體,用來存放各種數據的。 數據結構是計算機存儲、組織數據的方式。 資料庫是程序寫出來的,而程序=數據結構+演算法。 不
G. 數據結構
何謂數據結構
?
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由那些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,而物理上的數據結構反映成分數據在計算機內部的存儲安排。數據結構是數據存在的形式。 數據結構是信息的一種組織方式,其目的是為了提高演算法的效率,它通常與一組演算法的集合相對應,通過這組演算法集合可以對數據結構中的數據進行某種操作。
?
數據結構主要研究什麼?
?
數據結構作為一門學科主要研究數據的各種邏輯結構和存儲結構,以及對數據的各種操作。因此,主要有三個方面的內容:數據的邏輯結構;數據的物理存儲結構;對數據的操作(或演算法)。通常,演算法的
?
設計取決於數據的邏輯結構,演算法的實現取決於數據的物理存儲結構。
?
什麼是數據結構?什麼是邏輯結構和物理結構?
?
數據是指由有限的符號(比如,"0"和"1",具有其自己的結構、操作、和相應的語義)組成的元素的集合。結構是元素之間的關系的集合。通常來說,一個數據結構DS 可以表示為一個二元組:
?
DS=(D,S), //i.e., data-structure=(data-part,logic-structure-part) 這里D是數據元素的集合(或者是「結點」,可能還含有「數據項」或「數據域」),S是定義在D(或其他集合)上的關系的集合,S = { R | R : D×D×...},稱之為元素的邏輯結構。 邏輯結構有四種基本類型:集合結構、線性結構、樹狀結構和網路結構。表和樹是最常用的兩種高效數據結構,許多高效的演算法可以用這兩種數據結構來設計實現。表是線性結構的(全序關系),樹(偏序或層次關系)和圖(局部有序(weak/local orders))是非線性結構。
?
數據結構的物理結構是指邏輯結構的存儲鏡像(image)。數據結構 DS 的物理結構 P對應於從 DS 的數據元素到存儲區M(維護著邏輯結構S)的一個映射:
?
(PD,S) -- > M 存儲器模型:一個存儲器 M 是一系列固定大小的存儲單元,每個單元 U 有一個唯一的地址 A(U),該地址被連續地編碼。每個單元 U 有一個唯一的後繼單元 U'=succ(U)。 P 的四種基本映射模型:順序(sequential)、鏈接(linked)、索引(indexed)和散列(hashing)映射。
?
因此,我們至少可以得到4×4種可能的物理數據結構:
?
sequential (sets)
linked lists
indexed trees
hash graphs
?
(並不是所有的可能組合都合理)
?
??? 數據結構DS上的操作:所有的定義在DS上的操作在改變數據元素(節點)或節點的域時必須保持DS的邏輯和物理結構。
?
DS上的基本操作:任何其他對DS的高級操作都可以用這些基本操作來實現。最好將DS和他的所有基本操作看作一個整體——稱之為模塊。我們可以進一步將該模塊抽象為數據類型(其中DS的存儲結構被表示為私有成員,基本操作被表示為公共方法),稱之為ADT。作為ADT,堆棧和隊列都是一種特殊的表,他們擁有表的操作的子集。 對於DATs的高級操作可以被設計為(不封裝的)演算法,利用基本操作對DS進行處理。
?
好的和壞的DS:如果一個DS可以通過某種「線性規則」被轉化為線性的DS(例如線性表),則稱它為好的DS。好的DS通常對應於好的(高效的)演算法。這是由計算機的計算能力決定的,因為計算機本質上只能存取邏輯連續的內存單元,因此如何沒有線性化的結構邏輯上是不可計算的。比如對一個圖進行操作,要訪問圖的所有結點,則必須按照某種順序來依次訪問所有節點(要形成一個偏序),必須通過某種方式將圖固有的非線性結構轉化為線性結構才能對圖進行操作。
?
樹是好的DS——它有非常簡單而高效的線性化規則,因此可以利用樹設計出許多非常高效的演算法。樹的實現和使用都很簡單,但可以解決大量特殊的復雜問題,因此樹是實際編程中最重要和最有用的一種數據結構。樹的結構本質上有遞歸的性質——每一個葉節點可以被一棵子樹所替代,反之亦然。實際上,每一種遞歸的結構都可以被轉化為(或等價於)樹形結構。
?
從機器語言到高級語言的抽象
?
我們知道,演算法被定義為一個運算序列。這個運算序列中的所有運算定義在一類特定的數據模型上,並以解決一類特定問題為目標。這個運算序列應該具備下列四個特徵。 有限性,即序列的項數有限,且每一運算項都可在有限的時間內完成;確定性,即序列的每一項運算都有明確的定義,無二義性;可以沒有輸入運算項,但一定要有輸出運算項;可行性,即對於任意給定的合法的輸入都能得到相應的正確的輸出。這些特徵可以用來判別一個確定的運算序列是否稱得上是一個演算法。 但是,我們現在的問題不是要判別一個確定的運算序列是否稱得上是一個演算法,而是要對一個己經稱得上是演算法的運算序列,回顧我們曾經如何用程序設計語言去表達它。
?
演算法的程序表達,歸根到底是演算法要素的程序表達,因為一旦演算法的每一項要素都用程序清楚地表達,整個演算法的程序表達也就不成問題。
?
作為運算序列的演算法,有三個要素。 作為運算序列中各種運算的運算對象和運算結果的數據;運算序列中的各種運算;運算序列中的控制轉移。這三種要素依序分別簡稱為數據、運算和控制。 由於演算法層出不窮,變化萬千,其中的運算所作用的對象數據和所得到的結果數據名目繁多,不勝枚舉。最簡單最基本的有布爾值數據、字元數據、整數和實數數據等;稍復雜的有向量、矩陣、記錄等數據;更復雜的有集合、樹和圖,還有聲音、圖形、圖像等數據。 同樣由於演算法層出不窮,變化萬千,其中運算的種類五花八門、多姿多彩。最基本最初等的有賦值運算、算術運算、邏輯運算和關系運算等;稍復雜的有算術表達式和邏輯表達式等;更復雜的有函數值計算、向量運算、矩陣運算、集合運算,以及表、棧、隊列、樹和圖上的運算等:此外,還可能有以上列舉的運算的復合和嵌套。 關於控制轉移,相對單純。在串列計算中,它只有順序、分支、循環、遞歸和無條件轉移等幾種。
?
我們來回顧一下,自從計算機問世以來,演算法的上述三要素的程序表達,經歷過一個怎樣的過程。
?
最早的程序設計語言是機器語言,即具體的計算機上的一個指令集。當時,要在計算機上運行的所有演算法都必須直接用機器語言來表達,計算機才能接受。演算法的運算序列包括運算對象和運算結果都必須轉換為指令序列。其中的每一條指令都以編碼(指令碼和地址碼)的形式出現。與演算法語言表達的演算法,相差十萬八千里。對於沒受過程序設計專門訓練的人來說,一份程序恰似一份"天書",讓人看了不知所雲,可讀性
?
極差。
?
用機器語言表達演算法的運算、數據和控制十分繁雜瑣碎,因為機器語言所提供的指令太初等、原始。機器語言只接受算術運算、按位邏輯運算和數的大小比較運算等。對於稍復雜的運算,都必須一一分解,直到到達最初等的運算才能用相應的指令替代之。機器語言能直接表達的數據只有最原始的位、位元組、和字三種。演算法中即使是最簡單的數據如布爾值、字元、整數、和實數,也必須一一地映射到位、位元組和字
中,還得一一分配它們的存儲單元。對於演算法中有結構的數據的表達則要麻煩得多。機器語言所提供的控制轉移指令也只有無條件轉移、條件轉移、進入子程序和從子程序返回等最基本的幾種。用它們來構造循環、形成分支、調用函數和過程得事先做許多的准備,還得靠許多的技巧。 直接用機器語言表達演算法有許多缺點。
?
大量繁雜瑣碎的細節牽制著程序員,使他們不可能有更多的時間和精力去從事創造性的勞動,執行對他們來說更為重要的任務。如確保程序的正確性、高效性。程序員既要駕馭程序設計的全局又要深入每一個局部直到實現的細節,即使智力超群的程序員也常常會顧此失彼,屢出差錯,因而所編出的程序可靠性差,且開發周期長。 由於用機器語言進行程序設計的思維和表達方式與人們的習慣大相徑庭,只有經過
較長時間職業訓練的程序員才能勝任,使得程序設計曲高和寡。因為它的書面形式全是"密"碼,所以可讀性差,不便於交流與合作。因為它嚴重地依賴於具體的計算機,所以可移植性差,重用性差。這些弊端造成當時的計算機應用未能迅速得到推廣。
?
克服上述缺點的出路在於程序設計語言的抽象,讓它盡可能地接近於演算法語言。 為此,人們首先注意到的是可讀性和可移植性,因為它們相對地容易通過抽象而得到改善。於是,很快就出現匯編語言。這種語言對機器語言的抽象,首先表現在將機器語言的每一條指令符號化:指令碼代之以記憶符號,地址碼代之以符號地址,使得其含義顯現在符號上而不再隱藏在編碼中,可讓人望"文"生義。其次表現在這種語言擺脫了具體計算機的限制,可在不同指令集的計算機上運行,只要該計算機配上匯編語言的一個匯編程序。這無疑是機器語言朝演算法語言靠攏邁出的一步。但是,它離演算法語言還太遠,以致程序員還不能從分解演算法的數據、運算和控制到匯編才能直接表達的指令等繁雜瑣碎的事務中解脫出來。 到了50年代中期,出現程序設計的高級語言如Fortran,Algol60,以及後來的PL/l, Pascal等,演算法的程序表達才產生一次大的飛躍。
?
誠然,演算法最終要表達為具體計算機上的機器語言才能在該計算機上運行,得到所需要的結果。但匯編語言的實踐啟發人們,表達成機器語言不必一步到位,可以分兩步走或者可以築橋過河。即先表達成一種中介語言,然後轉成機器語言。匯編語言作為一種中介語言,並沒有獲得很大成功,原因是它離演算法語
?
言還太遠。這便指引人們去設計一種盡量接近演算法語言的規范語言,即所謂的高級語言,讓程序員可以用它方便地表達演算法,然後藉助於規范的高級語言到規范的機器語言的"翻譯",最終將演算法表達為機器語言。而且,由於高級語言和機器語言都具有規范性,這里的"翻譯"完全可以機械化地由計算機來完成,就像匯編語言被翻譯成機器語言一樣,只要計算機配上一個編譯程序。 上述兩步,前一步由程序員去完成,後一步可以由編譯程序去完成。在規定清楚它們各自該做什麼之後,這兩步是完全獨立的。它們各自該如何做互不相干。前一步要做的只是用高級語言正確地表達給定的演算法,產生一個高級語言程序;後一步要做的只是將第一步得到的高級語言程序翻譯成機器語言程序。至於程序員如何用高級語言表達演算法和編譯程序如何將高級語言表達的演算法翻譯成機器語言表達的演算法,顯然毫不相干。
?
處理從演算法語言最終表達成機器語言這一復雜過程的上述思想方法就是一種抽象。匯編語言和高級語言的出現都是這種抽象的範例。 與匯編語言相比,高級語言的巨大成功在於它在數據、運算和控制三方
?
面的表達中引入許多接近演算法語言的概念和工具,大大地提高抽象地表達演算法的能力。 在運算方面,高級語言如Pascal,除允許原封不動地運用演算法語言的四則運算、邏輯運算、關系運算、算術表達式、邏輯表達式外,還引入強有力的函數與過程的工具,並讓用戶自定義。這一工具的重要性不僅在於它精簡了重復的程序文本段,而且在於它反映出程序的兩級抽象。
?
在函數與過程調用級,人們只關心它能做什麼,不必關心它如何做。只是到函數與過程的定義時,人們才給出如何做的細節。用過高級語言的讀者都知道,一旦函數與過程的名稱、參數和功能被規定清楚,那麼,在程序中調用它們便與在程序的頭部說明它們完全分開。你可以修改甚至更換函數體與過程體,而不影響它們的被調用。如果把函數與過程名看成是運算名,把參數看成是運算的對象或運算的結果,那麼
?
,函數與過程的調用和初等運算的引用沒有兩樣。利用函數和過程以及它們的復合或嵌套可以很自然地表達演算法語言中任何復雜的運算。
?
在數據方面,高級語言如Pascal引人了數據類型的概念,即把所有的數據加以分類。每一個數據(包括表達式)或每一個數據變數都屬於其中確定的一類。稱這一類數據為一個數據類型。 因此,數據類型是數據或數據變數類屬的說明,它指示該數據或數據變數可能取的值的全體。對於無結構的數據,高級語言如Pascal,除提供標準的基本數據類型--布爾型、字元型、整型和實型外,還提供用戶可自定義的枚舉類、子界類型和指針類型。這些類型(除指針外),其使用方式都順應人們在演算法語言中使用的習慣。對於有結構的數據,高級語言如Pascal,提供了數組、記錄、有限制的集合和文件等四種標準的結構數據類型。其中,數組是科學計算中的向量、矩陣的抽象;記錄是商業和管理中的記錄的抽象;有限制的集合是數學中足夠小的集合的勢集的抽象;文件是諸如磁碟等外存儲數據的抽象。
?
人們可以利用所提供的基本數據類型(包括標準的和自定義的),按數組、記錄、有限制的集合和文件的構造規則構造有結構的數據。 此外,還允許用戶利用標準的結構數據類型,通過復合或嵌套構造更復雜更高層的結構數據。這使得高級語言中的數據類型呈明顯的分層。 高級語言中數據類型的分層是沒有窮盡的,因而用它們可以表達演算法語言中任何復雜層次的數據。 在控制方面,高級語言如Pascal,提供了表達演算法控制轉移的六種方式。
?
(1)預設的順序控制";"。
?
(2)條件(分支)控制:"if表達式(為真)then S1 else S2;" 。
?
(3)選擇(情況)控制:
?
"Case 表達式 of
?
值1: S1
值2: S2
...
值n: Sn
end"
?
(4)循環控制:
?
"while 表達式(為真) do S;" 或
"repeat S until 表達式(為真);" 或
"for變數名:=初值 to/downto 終值do S;"
?
(5)函數和過程的調用,包括遞歸函數和遞歸過程的調用。
?
(6)無條件轉移goto。
這六種表達方式不僅覆蓋了演算法語言中所有控製表達的要求,而且不再像機器語言或匯編語言那樣原始、那樣繁瑣、那樣隱晦,而是如上面所看到的,與自然語言的表達相差無幾。 程序設計語言從機器語言到高級語言的抽象,帶來的主要好處是: 高級語言接近演算法語言,易學、易掌握,一般工程技術人員只要幾周時間的培訓就可以勝任程序員的工作;高級語言為程序員提供了結構化程序設計的環境和工具,使得設計出來的程序可讀性好,可維護性強,可靠性高;高級語言遠離機器語言,與具體的計算機硬體關系不大,因而所寫出來的程序可移植性好,重用率高; 由於把繁雜瑣碎的事務交給了編譯程序去做,所以自動化程度高,開發周期短,且程、序員得到解脫,可以集中時間和精力去從事對於他們來說更為重要的創造性勞動,以提高、程序的質量。
?
數據結構、數據類型和抽象數據類型
?
數據結構、數據類型和抽象數據類型,這三個術語在字面上既不同又相近,反映出它們在含義上既有區別又有聯系。
?
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由哪些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,物理上的數據結構反映成分數據在計算機內的存儲安排。數據結構是數據存在的形式。
?
數據是按照數據結構分類的,具有相同數據結構的數據屬同一類。同一類數據的全體稱為一個數據類型。在程序設計高級語言中,數據類型用來說明一個數據在數據分類中的歸屬。它是數據的一種屬性。這個屬性限定了該數據的變化范圍。為了解題的需要,根據數據結構的種類,高級語言定義了一系列的數據類型。不同的高級語言所定義的數據類型不盡相同。Pascal語言所定義的數據類型的種類。
?
其中,簡單數據類型對應於簡單的數據結構;構造數據類型對應於復雜的數據結構;在復雜的數據結構里,允許成分數據本身具有復雜的數據結構,因而,構造數據類型允許復合嵌套;指針類型對應於數據結構中成分數據之間的關系,表面上屬簡單數據類型,實際上都指向復雜的成分數據即構造數據類型中的數據,因此這里沒有把它劃入簡單數據類型,也沒有劃入構造數據類型,而單獨劃出一類。
?
數據結構反映數據內部的構成方式,它常常用一個結構圖來描述:數據中的每一項成分數據被看作一個結點,並用方框或圓圈表示,成分數據之間的關系用相應的結點之間帶箭號的連線表示。如果成分數據本身又有它自身的結構,則結構出現嵌套。這里嵌套還允許是遞歸的嵌套。
?
由於指針數據的引入,使構造各種復雜的數據結構成為可能。按數據結構中的成分數據之間的關系,數據結構有線性與非線性之分。在非線性數據結構中又有層次與網狀之分。 由於數據類型是按照數據結構劃分的,因此,一類數據結構對應著一種數據類型。數據類型按照該類型中的數據所呈現的結構也有線性與非線性之分,層次與網狀之分。一個數據變數,在高級語言中的類型說明必須是讀變數所具有的數據結構所對應的數據類型。最常用的數據結構是數組結構和記錄結構。數組結構的特點是:
?
成分數據的個數固定,它們之間的邏輯關系由成分數據的序號(或叫數組的下標)來體現。這些成分數據按照序號的先後順序一個挨一個地排列起來。每一個成分數據具有相同的結構(可以是簡單結構,也可以是復雜結構),因而屬於同一個數據類型(相應地是簡單數據類型或構造數據類型)。這種同一的數據類型稱為基類型。所有的成分數據被依序安排在一片連續的存儲單元中。 概括起來,數組結構是一個線性的、均勻的、其成分數據可隨機訪問的結構。
?
由於這、種結構有這些良好的特性,所以最常被人們所採用。在高級語言中,與數組結構相對應的、數據類型是數組類型,即數組結構的數據變數必須說明為array [i] of T0 ,其中i是數組、結構的下標類型,而T0是數組結構的基類型。 記錄結構是另一種常用的數據結構。它的特點是:與數組結構一樣,成分數據的個數固定。但成分數據之間沒有自然序,它們處於平等地位。每一個成分數據被稱為一個域並賦予域名。不同的域有不同的域名。不同的域允許有不同的結構,因而允許屬於不同的數據類型。與數組結構一樣,它們可以隨機訪問,但訪問的途徑靠的是域名。在高級語言中記錄結構對應的數據類型是記錄類型。記錄結構的數據的變數必須說明為記錄類型。
?
抽象數據類型的含義在上一段已作了專門敘述。它可理解為數據類型的進一步抽象。即把數據類型和數據類型上的運算捆在一起,進行封裝。引入抽象數據類型的目的是把數據類型的表示和數據類型上運算的實現與這些數據類型和運算在程序中的引用隔開,使它們相互獨立。對於抽象數據類型的描述,除了必須描述它的數據結構外,還必須描述定義在它上面的運算(過程或函數)。抽象數據類型上定義的過程和函
數以該抽象數據類型的數據所應具有的數據結構為基礎。
?
泛型設計和數據結構與演算法
?
下面我想再說說關於泛型程序設計模型對於數據結構和演算法方面的最新推動,泛型思想已經把數據結
?
構和演算法方面的基本思想抽象到了一個前所未有的高度,現在有多種程序設計語言支持泛型設計,比如
ADA,C++,而且據說在JAVA的下一版本和C#中也將對泛型設計進行全面的支持。
?
先說說泛型設計的基本思想:泛型編程(generic programming,以下直接以GP稱呼)是一種全新的程序設計思想,和OO,OB,PO這些為人所熟知的程序設計想法不同的是GP抽象度更高,基於GP設計的組件之間偶合度底,沒有繼承關系,所以其組件間的互交性和擴展性都非常高。我們都知道,任何演算法都是作用在一種特定的數據結構上的,最簡單的例子就是快速排序演算法最根本的實現條件就是所排序的對象是存
貯在數組裡面,因為快速排序就是因為要用到數組的隨機存儲特性,即可以在單位時間內交換遠距離的對象,而不只是相臨的兩個對象,而如果用聯表去存儲對象,由於在聯表中取得對象的時間是線性的既O[n],這樣將使快速排序失去其快速的特點。也就是說,我們在設計一種演算法的時候,我們總是先要考慮其應用的數據結構,比如數組查找,聯表查找,樹查找,圖查找其核心都是查找,但因為作用的數據結構不同
?
將有多種不同的表現形式。數據結構和演算法之間這樣密切的關系一直是我們以前的認識。泛型設計的根本思想就是想把演算法和其作用的數據結構分離,也就是說,我們設計演算法的時候並不去考慮我們設計的演算法將作用於何種數據結構之上。泛型設計的理想狀態是一個查找演算法將可以作用於數組,聯表,樹,圖等各種數據結構之上,變成一個通用的,泛型的演算法。這樣的理想是不是很誘惑人?
?
泛型編程帶來的是前所未有的彈性以及不會損失效率的抽象性,GP和OO不同,它不要求你通過額外的間接層來調用函數:它讓你撰寫完全一般化並可重復使用的演算法,其效率與針對特定數據結構而設計的演算法旗鼓相當。我們大家都知道數據結構在C++中可以用用戶定義類型來表示,而C++中的模板技術就是以類型作為參數,那麼我可以想像利用模板技術可以實現我們開始的GP思想,即一個模板函數可以對於各種傳遞進來的類型起作用,而這些類型就可以是我們定義的各種數據結構。
?
泛型演算法抽離於特定類型和特定數據結構之外,使得其適應與盡可能的一般化類型,演算法本身只是為了實現演算法其需要表達的邏輯本質而不去被為各種數據結構的實現細節所干擾。這意味著一個泛型演算法實際具有兩部分。1,用來描敘演算法本質邏輯的實際指令;2,正確指定其參數類型必須滿足的性質的一組需求條件。到此,相信有不少人已經開始糊塗了,呵呵,不要緊。畢竟GP是一種抽象度非常高的程序設計思想,裡面的核心就是抽象條件成為成為程序設計過程中的核心,從而取代了類型這在OO裡面的核心地位,正是因為類型不在是我們考慮的重點,類型成為了抽象條件的外衣,所以我們稱這樣的程序思想為泛型思想------把類型泛化。
H. 怎樣用excel圖表功能同時進行橫向和縱向的數據分析
1建立數據透視表(圖)的目的數據透視表能幫助用戶分析、組織數據。利用它可以很快地從不同角度對數據進行分類匯兌。首先應該明確的是:不是所有工作表都有建立數據透視表(圖)的必要。記錄數量眾多、以流水帳形式記錄、結構復雜的工作表,為了,將其中的一些內在規律顯現出來,可將工作表重新組合並添加演算法。即,建立數據透視表(圖)。例如,有一張工作表,是一個大公司員工(姓名、性別、出生年月、所在部門、工作時間、政治面貌、學歷、技術職稱、任職時間、畢業院校、畢業時間等)信息一覽表,不但,欄位(列)多,且記錄(行)數眾多。為此,需要建立數據透視表,以便將一些內在規律顯現出來。2創建數據透視表⑴將游標移入需建立數據透視表的工作表中,然後單擊"數據"·"數據透視表和圖表報告"。⑵"數據透視表和數據透視圖向導-3步驟1"對話框上,單擊"下一步"(選用默認選項,「Microsoft Excel數據清單或資料庫」)。⑶在"數據透視表和數據透視圖向導-3步驟2"對話框上,「選定區域」框中,已經自動選定工作表的(整個)數據區域,單擊"下一步"。⑷在"數據透視表和數據透視圖向導-3步驟3"對話框上,選用默認選項:"新建工作表",在當前工作的左側創建一個新工作表。這樣做,可以保證原始數據的安全以及可利用性。單擊"完成"後,一張新工作表-「數據表(下圖所示)」即出現在當前工作的左側。3設置數據表中數據的關系3.1數據表上,幾個區域的設定方法1、「請將行欄位拖至此處」(相當於「左端標題行」),將作為橫向分類依據的欄位,從「數據透視表」工具欄上拖至此處。例如,將「所在部門」欄位拖至此處。2、「請將列欄位拖至此處」(相當於「頂端標題行」),將作為縱向分類依據的欄位,從「數據透視表」工具欄上拖至此處。拖至此處的欄位是計數的「依據」。例如,將「性別」欄位拖至此處,計數的依據就是「男」和「女」兩項。3、「請將數據項拖至此處」(相當於「普通數據區」),將作為統計依據的欄位,從「數據透視表」工具欄上拖至此處。拖入該區中的欄位,Excel將用某種演算法,對其進行計算,然後將計算結果(匯總數值)顯示出來(如何設置演算法見3.2)。4、「請將頁欄位拖至此處」,將作為分類顯示(篩選)依據的欄位,從「數據透視表」工具欄上拖至此處。可以將一個或多個欄位拖至此處。此區域中的欄位是分類篩選的「首要」條件。例如,將「政治面貌」欄位拖至此處,然後在其中,選擇「黨員」,則下方表格中,只統計「黨員」有關的情況。提示:「頂端標題行」和「頁欄位」區中,均可有多個欄位。3.2透視分析數據改變透視表內部的透視關系,從不同的角度查看數據之間的內在關系。主要包括:改變透視關系、添加或刪除項目以及數據更新1、改變透視關系更改各區域中的放置欄位,或改變欄位的分組條件即可以改變透視關系。添加欄位的方法上面已經介紹過了,刪除方法,是將需刪除欄位拖出數據表區域即可。改變欄位分組條件的方法:單擊欄位名右側的三角形按鈕,然後單擊下拉式列表菜單上的相應條件2、改變統計欄位的演算法雙擊透視表左上角的統計欄位名,打開」數據透視表欄位「對話框(右圖)。在「匯總方式」框內,選定所需的演算法,然後單擊「確定」。提示:對日期型欄位求和時,以1990年1月1日起算。3、透視表的更新若原工作表中的數據(含標題行-欄位名)更改後,透視表作相應更新的方法:默認情況下,當重新打開工作薄時,透視表數據將自動更新。在不重新打開工作薄的情況下,在原工作表的數據更改後,在透視表中單擊「數據透視表」工具欄上的「更新數據」按鈕即可。提示:普通數據更改後,單擊「更新數據」按鈕後,即可完成更新。若更改了已經拖入透視表中的欄位名,則該欄位將從透視中刪除,需要重新添加。4透視圖表將透視表製作成透視圖表的方法是:單擊「數據透視表」工具欄上的「圖表向導」即可生成一張圖表(位於左側的新工作表上)。透視圖表的編輯方法,與普通圖表相似。
I. 如何創建數據透視表
1建立數據透視表(圖)的目的 數據透視表能幫助用戶分析、組織數據。利用它可以很快地從不同角度對數據進行分類匯兌。 首先應該明確的是:不是所有工作表都有建立數據透視表(圖)的必要。 記錄數量眾多、以流水帳形式記錄、結構復雜的工作表,為了,將其中的一些內在規律顯現出來,可將工作表重新組合並添加演算法。即,建立數據透視表(圖)。 例如,有一張工作表,是一個大公司員工(姓名、性別、出生年月、所在部門、工作時間、政治面貌、學歷、技術職稱、任職時間、畢業院校、畢業時間等)信息一覽表,不但,欄位(列)多,且記錄(行)數眾多。為此,需要建立數據透視表,以便將一些內在規律顯現出來。 2創建數據透視表 ⑴將游標移入需建立數據透視表的工作表中,然後單擊"數據"·"數據透視表和圖表報告"。 ⑵"數據透視表和數據透視圖向導-3步驟1"對話框上,單擊"下一步"(選用默認選項,「Microsoft Excel數據清單或資料庫」)。 ⑶在"數據透視表和數據透視圖向導-3步驟2"對話框上,「選定區域」框中,已經自動選定工作表的(整個)數據區域,單擊"下一步"。 ⑷在"數據透視表和數據透視圖向導-3步驟3"對話框上,選用默認選項:"新建工作表",在當前工作的左側創建一個新工作表。這樣做,可以保證原始數據的安全以及可利用性。單擊"完成"後,一張新工作表-「數據表(下圖所示)」即出現在當前工作的左側。 3設置數據表中數據的關系 3.1數據表上,幾個區域的設定方法 1、「請將行欄位拖至此處」(相當於「左端標題行」),將作為橫向分類依據的欄位,從「數據透視表」工具欄上拖至此處。例如,將「所在部門」欄位拖至此處。 2、「請將列欄位拖至此處」(相當於「頂端標題行」),將作為縱向分類依據的欄位,從「數據透視表」工具欄上拖至此處。 拖至此處的欄位是計數的「依據」。例如,將「性別」欄位拖至此處,計數的依據就是「男」和「女」兩項。 3、「請將數據項拖至此處」(相當於「普通數據區」),將作為統計依據的欄位,從「數據透視表」工具欄上拖至此處。 拖入該區中的欄位,Excel將用某種演算法,對其進行計算,然後將計算結果(匯總數值)顯示出來(如何設置演算法見3.2)。 4、「請將頁欄位拖至此處」,將作為分類顯示(篩選)依據的欄位,從「數據透視表」工具欄上拖至此處。 可以將一個或多個欄位拖至此處。此區域中的欄位是分類篩選的「首要」條件。例如,將「政治面貌」欄位拖至此處,然後在其中,選擇「黨員」,則下方表格中,只統計「黨員」有關的情況。 提示:「頂端標題行」和「頁欄位」區中,均可有多個欄位。 3.2透視分析數據 改變透視表內部的透視關系,從不同的角度查看數據之間的內在關系。主要包括:改變透視關系、添加或刪除項目以及數據更新 1、改變透視關系 更改各區域中的放置欄位,或改變欄位的分組條件即可以改變透視關系。 添加欄位的方法上面已經介紹過了,刪除方法,是將需刪除欄位拖出數據表區域即可。 改變欄位分組條件的方法:單擊欄位名右側的三角形按鈕,然後單擊下拉式列表菜單上的相應條件 2、改變統計欄位的演算法 雙擊透視表左上角的統計欄位名,打開」數據透視表欄位「對話框(右圖)。 在「匯總方式」框內,選定所需的演算法,然後單擊「確定」。 提示:對日期型欄位求和時,以1990年1月1日起算。 3、透視表的更新 若原工作表中的數據(含標題行-欄位名)更改後,透視表作相應更新的方法: 默認情況下,當重新打開工作薄時,透視表數據將自動更新。 在不重新打開工作薄的情況下,在原工作表的數據更改後,在透視表中單擊「數據透視表」工具欄上的「更新數據」按鈕即可。 提示:普通數據更改後,單擊「更新數據」按鈕後,即可完成更新。若更改了已經拖入透視表中的欄位名,則該欄位將從透視中刪除,需要重新添加。 4透視圖表 將透視表製作成透視圖表的方法是:單擊「數據透視表」工具欄上的「圖表向導」即可生成一張圖表(位於左側的新工作表上)。 透視圖表的編輯方法,與普通圖表相似。
J. 數據結構演算法 兩線性表A,B求交集。。。請高手指點!!!
將A與B分別排序,然後求交。
例如:將A與B按升序排列,設A表頭為P,B表頭為Q,若A[P]>B[Q]那麼Q++,若A[P]<B[Q]那麼P++;如果A[P]=B[Q],Q++、P++,Count++,And[Count]=B[Q-1];當P或者Q其中一個達到了A或者B的表尾 演算法結束。
以下是參考程序:
//----------------------------------------
#include <stdio.h>
int A[100001],B[100001];
int Ans[100001],Count,N,M;
void Swap(int &a,int &b)
{
int Temp=a;
a=b;
b=Temp;
}
void Sort(int L,int R,int A[])
{
int p,q,Mid;
if (L==R) return ;
Mid=A[(L+R)/2];
p=L-1;q=R+1;
do
{
p++;q--;
while (A[p]<Mid) p++;
while (A[q]>Mid) q--;
if (p<q) Swap(A[p],A[q]);
}while (p<q);
Sort(L,q,A);
Sort(q+1,R,A);
}
void Init()
{
int p,q;
p=q=1;
for (int i=2;i<=N;i++)
{
if (A[i]!=A[p])
{
p++;
A[p]=A[i];
}
}
for (int i=2;i<=M;i++)
{
if (A[i]!=B[q])
{
q++;
B[q]=A[i];
}
}
}
int main(void)
{
int p,q;
scanf("%d %d",&N,&M);//輸入兩個集合的元素的個數
for (int i=1;i<=N;i++)
scanf("%d",&A[i]);// 讀取A集合
for (int i=1;i<=M;i++)
scanf("%d",&B[i]);//讀取B集合
Sort(1,N,A);//A集合排序
Sort(1,M,B);//B集合排序
Init();//剔除同一集合的相同元素
p=q=1;
Count=0;
while (p<=N&&q<=M)//求解.
{
if (A[p]<B[q])
{
p++;
continue;
}
if (A[p]>B[q])
{
q++;
continue;
}
if (A[p]==B[q])
{
p++;q++;
Count++;
Ans[Count]=B[q-1];
continue;
}
}
for (int i=1;i<=Count;i++)
printf("%d ",Ans[i]);
return 0;
}