廣義表的長度,指的是廣義表中所包含的資料元素的個數。
由於廣義表中可以同時儲存原子和子表兩種型別的資料,因此在計算廣義表的長度時規定,廣義表中儲存的每個原子算作乙個資料,同樣每個子表也只算作是乙個資料。
例如,在廣義表 } 中,它包含乙個原子和乙個子表,因此該廣義表的長度為 2。
再比如,廣義表 } 中只有乙個子表 ,因此它的長度為 1。
前面我們用 ls= 來表示乙個廣義表,其中每個 ai 都可用來表示乙個原子或子表,其實它還可以表示廣義表 ls 的長度為 n。
廣義表規定,空表 {} 的長度為 0。
在程式設計實現求廣義表長度時,由於廣義表的儲存使用的是鍊錶
結構,且有以下兩種方式
對於圖 1a) 來說,只需計算最頂層(紅色標註)含有的節點數量,即可求的廣義表的長度。
同理,對於圖 1b) 來說,由於其最頂層(藍色標註)表示的此廣義表,而第二層(紅色標註)表示的才是該廣義表中包含的資料元素,因此可以通過計算第二層中包含的節點數量,即可求得廣義表的長度。
由於兩種演算法的實現非常簡單,這裡只給出計算圖 1a) 中廣義表長度的 c 語言實現**:
#include #include typedef struct glnodeptr;//子表結點的指標域,hp指向表頭;tp指向表尾
};}*glist;
glist creatglist(glist c)
int glistlength(glist c)
return number;
}int main()
程式執行結果為:
廣義表的深度,可以通過觀察該表中所包含括號的層數間接得到
此廣義表從左往右數有兩層左括號(從右往左數也是如此),因此該廣義表的深度為 2。
再比如,廣義表 ,}} 中,子表 和 } 位於同層,此廣義表中包含 3 層括號,因此深度為 3。
以上觀察括號的方法需將廣義表當做字串看待,並借助棧儲存結構實現,這裡不做重點介紹。
編寫程式計算廣義表的深度時,以第一種廣義表為例,可以採用遞迴的方式:
其實,每次遞迴返回的值都是當前所在的子表的深度,原子預設深度為 0,空表預設深度為 1。
c 語言實現**如下:
#include #include typedef struct glnodeptr;//子表結點的指標域,hp指向表頭;tp指向表尾
};}*glist,gnode;
glist creatglist(glist c)
int glistdepth(glist c)
//如果表c為原子時,直接返回0;
if (c->tag==0)
int max=0;//設定表c的初始長度為0;
for (glist pp=c; pp; pp=pp->ptr.tp)
}//程式執行至此處,表明廣義表不是空表,由於原子返回的是0,而實際長度是1,所以,此處要+1;
return max+1;
}int main(int argc, const char * ar**)
程式執行結果:
廣義表的深度為:2
廣義表的長度和深度怎麼算 機器學習 廣義線性模型
ai小白入門 作者 編輯 文傑 yuquanle 機器學習 知否?知否?廣義線性模型 mp.weixin.qq.com 從線性回歸,logistic回歸,softmax回歸,最大熵的概率解釋來看,我們會發現線性回歸是基於高斯分布 最大似然估計的結果,logistic回歸是伯努利分布 對數最大似然估計...
C 如何實現廣義表詳解
以下給出幾種簡單的廣義表模型 由上圖我們可以看到,廣義表的節點型別無非head value sub三種,這裡設定列舉型別,利用列舉變數來記錄每個節點的型別 enum type 每個節點都有自己的型別以及next指標,除此之外,如果該節點是value型別還要分配空間儲存該節點的有效值 但是若該節點是s...
廣義表的建立,遍歷,求深度
include typedef char atomtype typedef enum elemtag atom 0,表示原子 list 1,表示子表 typedef struct glnode htp 表結點的指標域htp,包括 表頭指標域hp和表尾指標域tp atom htp atom htp 是...