數據結構學習之堆

? ? ? ? 本篇我們將學習新的數據結構——二叉樹。

? ? ? ? 作者的個人gitee:樓田莉子 (riko-lou-tian) - Gitee.com

目錄

樹的概念

? ? ? ? 樹形結構

? ? ? ? 非樹形結構

樹的相關術語

樹的表示

樹在實際生活上的應用

二叉樹

? ? ? ? 慢二叉樹

????????完全二叉樹

二叉樹的儲存結構

? ? ? ? 二叉樹的存儲結構

????????順序結構

? ? ? ? 鏈式結構

堆的概念(順序結構二叉樹)

堆的模擬實現

????????堆的結構

? ?? ? 堆的初始化

? ? ? ? 堆的銷毀

? ? ? ? 堆的打印?

? ? ? ? 判斷堆是否為空?

? ? ? ? 堆的數據插入

? ? ? ? 交換函數

? ? ? ? 堆向上調整

? ? ? ? 堆向下調整?

????????數據刪除

? ? ? ? 堆排序

堆的Top-k問題


樹的概念

? ? ? ? 樹是一種非線性的數據結構。它由n(n>=0)個有限結點組成?個具有層次關系的集合。把它叫做樹是因為它看起來像?棵倒掛的樹,也就是說它是根朝上,?葉朝下的。

? ? ? ? 樹形結構

????????有?個特殊的結點,稱為根結點,根結點沒有前驅結點

????????除根結點外,其余結點被分成 M(M>0) 個互不相交的集合 T1、T2、……、Tm ,其中每?個集合Ti(1 <= i <= m) ?是?棵結構與樹類似的?樹。每棵?樹的根結點有且只有?個前驅,可以有 0 個或多個后繼。因此,樹是遞歸定義的。

? ? ? ? 具體表現如下:


????????樹形結構中,?樹之間不能有交集,否則就不是樹形結構
? ? ? ? 當然實際上也存在非樹形結構。

? ? ? ? 非樹形結構

? ? ? ? 如下圖所示,就是幾個非樹形結構。

?????????樹是不相交的(如果存在相交就是圖)

????????除了根結點外,每個結點有且僅有?個?結點

?????????棵N個結點的樹有N-1條邊

樹的相關術語

?結點/雙親結點:若?個結點含有?結點,則這個結點稱為其?結點的?結點; 如上圖:A是B的?結點

?結點/孩?結點:?個結點含有的?樹的根結點稱為該結點的?結點; 如上圖:B是A的孩?結點結點的度:?個結點有?個孩?,他的度就是多少;?如A的度為6,F的度為2,K的度為0

樹的度:?棵樹中,最?的結點的度稱為樹的度; 如上圖:樹的度為 6

葉?結點/終端結點:度為 0 的結點稱為葉結點; 如上圖: B、C、H、I... 等結點為葉結點 分?結點/?終端結點:度不為 0 的結點; 如上圖: D、E、F、G... 等結點為分?結點 兄弟結點:具有相同?結點的結點互稱為兄弟結點(親兄弟); 如上圖: B、C 是兄弟結點

結點的層次:從根開始定義起,根為第 1 層,根的?結點為第 2 層,以此類推;樹的?度或深度:樹中結點的最?層次; 如上圖:樹的?度為 4

結點的祖先:從根到該結點所經分?上的所有結點;如上圖: A 是所有結點的祖先

路徑:?條從樹中任意節點出發,沿?節點-?節點連接,達到任意節點的序列;?如A到Q的路徑為: A-E-J-Q;H到Q的路徑H-D-A-E-J-Q?孫:以某結點為根的?樹中任?結點都稱為該結點的?孫。如上圖:所有結點都是A的?孫

森林:由 m(m>0) 棵互不相交的樹的集合稱為森林;

樹的表示

????????孩?兄弟表?法

樹結構相對線性表就?較復雜了,要存儲表?起來就?較?煩了,既然保存值域,也要保存結點和結點之間的關系,實際中樹有很多種表??式如:雙親表?法,孩?表?法、孩?雙親表?法以及孩?兄弟表?法等。我們這?就簡單的了解其中最常?的孩?兄弟表?法

struct TreeNode
{
struct Node* child; // 左邊開始的第?個孩?結點
struct Node* brother; // 指向其右邊的下?個兄弟結點
int data; // 結點中的數據域
}

????????由上述代碼,可以這么推廣

樹在實際生活上的應用

?????????件系統是計算機存儲和管理?件的?種?式,它利?樹形結構來組織和管理?件和?件夾。在?件系統中,樹結構被?泛應?,它通過?結點和?結點之間的關系來表?不同層級的?件和?件夾之間的關聯。

二叉樹

? ? ? ? 而樹型結構中,我們常用的是二叉樹。一棵二叉樹是結點的有限集合,該集合由?個根結點加上兩棵別稱為左?樹和右?樹的?叉樹組成或者為空。

? ? ? ? 我們可以發現:

1. ?叉樹不存在度?于 2 的結點

2. ?叉樹的?樹有左右之分,次序不能顛倒,因此?叉樹是有序樹

注意:對于任意的?叉樹都是由以下?種情況復合?成的

? ? ? ? 二叉樹也有特殊和普通兩種情況。

? ? ? ? 我們先學習特殊情況。

? ? ? ? 慢二叉樹

?????????個?叉樹,如果每?個層的結點數都達到最?值,則這個?叉樹就是滿?叉樹。也就是說,如果?個?叉樹的層數為 K ,且結點總數是 2k - 1 ,則它就是滿?叉樹。

? ? ? ? 觀察發現滿二叉樹每一層有2^(n-1)個結點,則總結點數目就是2^n-1個(運用等比數列的求和公式)?

????????完全二叉樹

????????完全?叉樹是效率很?的數據結構,完全?叉樹是由滿?叉樹?引出來的。對于深度為 K 的,有 n 個結點的?叉樹,當且僅當其每?個結點都與深度為K的滿?叉樹中編號從 1 ? n 的結點??對應時稱之為完全?叉樹。要注意的是滿?叉樹是?種特殊的完全?叉樹

? ? ? ?完全二叉樹的特點:

????????(1)除了最后一層,每層節點個數達到最大。

? ? ? ? (2)最后一層的節點個數不一定達到最大。(最后一層達到最大則既是完全二叉樹也是滿二叉樹)

? ? ? ? (3)結點從左到右依次排列。

????????滿二叉樹一定是完全二叉樹,完全二叉樹不一定是滿二叉樹。

?叉樹性質

根據滿?叉樹的特點可知:

????????1、若規定根結點的層數為 1 ,則?棵?空?叉樹的第i層上最多有 2i-1 個結點

????????2、若規定根結點的層數為 1 ,則深度為 h 的?叉樹的最?結點數是 2h - 1

? ? ? ? 3、若規定根結點的層數為 1 ,具有 n 個結點的滿?叉樹的深度h=\log 2 (n+1) ( log以2為底, n+1 為對數)

二叉樹的儲存結構

? ? ? ? 二叉樹的存儲結構

?????????叉樹?般可以使?兩種結構存儲,?種順序結構,?種鏈式結構

????????順序結構

????????順序結構存儲就是使?數組來存儲,?般使?數組只適合表?完全?叉樹,因為不是完全?叉樹會有空間的浪費,完全?叉樹更適合使?順序結構存儲。

? ? ? ? 其中非完全二叉樹的空數組表示NULL。?

????????現實中我們通常把堆(?種?叉樹)使?順序結構的數組來存儲,需要注意的是這?的堆和操作系統虛擬進程地址空間中的堆是兩回事,?個是數據結構,?個是操作系統中管理內存的?塊區域分段。

? ? ? ? 鏈式結構

?????????叉樹的鏈式存儲結構是指,?鏈表來表??棵?叉樹,即?鏈來指?元素的邏輯關系。 通常的?法是鏈表中每個結點由三個域組成,數據域和左右指針域,左右指針分別?來給出該結點左孩?和右孩?所在的鏈結點的存儲地址 。鏈式結構?分為?叉鏈和三叉鏈,當前我們學習中?般都是?叉鏈。后期我們學到?階數據結構的時候如紅?樹等會?到三叉鏈。

堆的概念(順序結構二叉樹)

????????堆是一種特殊的二叉樹,除了二叉樹的性質之外還有其他的性質????????

????????如果有?個關鍵碼的集合 K = {k0 , k1 , k2 , ...,kn-1 },把它的所有元素按完全?叉樹的順序存儲?式存儲,在?個?維數組中,并滿?: Ki <= K2?i+1(Ki >= K2?i+1 且Ki <= K2?i+2),
i = 0、1、2... ,則稱為?堆(或?堆)。將根結點最?的堆叫做最?堆或?根堆,根結點最?的堆叫做最?堆或?根堆。

? ? ? ??堆分為兩類:

? ? ? ? 大根堆:

? ? ? ? 小根堆:

? ? ? 但是小堆≠升序,大堆≠降序。??

????????堆具有以下性質:

????????堆中某個結點的值總是不?于或不?于其?結點的值;

????????堆總是?棵完全?叉樹。

?????????叉樹性質:

對于具有 n 個結點的完全?叉樹,如果按照從上?下從左?右的數組順序對所有結點從

0 開始編號,則對于序號為 i 的結點有:

1. 若 i>0 , i 位置結點的雙親序號: (i-1)/2 ; i=0 , i 為根結點編號,?雙親結點

2. 若 2i+1<n ,左孩?序號: 2i+1 , 2i+1>=n 否則?左孩?。

3. 若 2i+2<n ,右孩?序號: 2i+2 , 2i+2>=n 否則?右孩?。

堆的模擬實現

????????堆的結構

typedef int HPDataType;
//堆的結構
typedef struct Heap
{HPDataType*arr;	//堆中的數據int size;		//堆的有效數據個數int capacity;	//堆的總容量
}HP;

? ?? ? 堆的初始化

//堆的初始化
void HP_Init(HP* php)
{php->arr = NULL;php->size=php->capacity  = 0;
}

? ? ? ? 堆的銷毀

//堆的銷毀
void HP_Destroy(HP* php)
{if(php->arr)free(php->arr);php->arr = NULL;php->size = php->capacity = 0;
}

? ? ? ? 堆的打印?

void HPPrint(HP* php)
{for (int i = 0; i < php->size; i++){printf("%d ", php->arr[i]);}printf("\n");
}

? ? ? ? 判斷堆是否為空?

//判空
bool HP_Empty(HP* php)
{assert(php);return php->size == 0;
}

? ? ? ? 堆的數據插入

? ? ? ? 初始版本:

//堆的插入操作
void HP_Push(HP* php, HPDataType data)
{assert(php->arr!= NULL);if (php->size == php->capacity){int new_capacity =php->capacity==0?4: (php->capacity) * 2;HPDataType*tmp=(HPDataType*)realloc(php->arr, new_capacity * sizeof(HPDataType));if (tmp == NULL){perror("realloc error");exit(1);}php->arr = tmp;php->capacity = new_capacity;}php->arr[php->size++] = data;
}

? ? ? ? 但是記住,數據插入后要進行調整讓它還是一個堆。

????????所以我們還需要一個堆向上調整的函數

? ? ? ? 因此?最終版本的數據插入函數

?//堆的插入操作
void HP_Push(HP* php, HPDataType data)
{assert(php);//判斷空間是否足夠if (php->size == php->capacity){int newCapcity = php->capacity == 0 ? 4 : 2 * php->capacity;HPDataType* tmp = (HPDataType*)realloc(php->arr, newCapcity * sizeof(HPDataType));if (tmp == NULL){perror("realloc fail!");exit(1);}php->arr = tmp;php->capacity = newCapcity;}php->arr[php->size] = data;//向上調整HP_UpAdjust(php->arr, php->size);++php->size;
}?

? ? ? ? 交換函數

void swap(HPDataType* x, HPDataType* y)
{HPDataType tmp = *x;*x = *y;*y = tmp;
}

? ? ? ? 堆向上調整

//堆在進行插入的時候需要調整為堆
//堆數據向上調整
void HP_UpAdjust(HPDataType* php, int child)
{int parent = (child - 1) / 2;while (child > 0){//大堆:>//小堆:<if (php[child] > php[parent]){//調整swap(&php[child], &php[parent]);child = parent;parent = (child - 1) / 2;}else {break;}}}

? ? ? ? 堆向下調整?

//堆數據向下調整
void HP_DownAdjust(HPDataType* php, int parent,int n)
{int child =parent * 2 + 1;//左孩子while (child < n){//大堆:<//小堆:>if (child+1<n && php[child] < php[child + 1]){child++;}//大堆:>//小堆:<if (php[child] > php[parent]){//調整swap(&php[child], &php[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}

? ? ? ? child循環了多少次取決于堆的高度/深度?

????????數據刪除

//堆的刪除操作
HPDataType HP_Pop(HP* php)
{assert(!HP_Empty(php));swap(&php->arr[0], &php->arr[php->size - 1]);--php->size;//向下調整HP_DownAdjust(php->arr, 0, php->size);
}

? ? ? ? 堆排序

? ? ? ? 當我們寫出下面這行代碼的時候

void test2()
{HP hp;HP_Init(&hp);HP_Push(&hp, 27);HP_Push(&hp, 58);HP_Push(&hp, 10);HP_Push(&hp, 34);HPPrint(&hp);while (!HP_Empty(&hp)){int top=HP_Top(&hp);printf("%d ", top);HP_Pop(&hp);}HP_Destroy(&hp);
}

? ? ? ? 運行一下結果為:

????????這就是堆排序嗎?

????????并不是。

? ? ? ? 在堆里堆頂一定是最值。大堆堆頂是最大值,小堆堆頂是最小值

? ? ? ? 堆的排序是利用堆的思想而不是利用堆的數據結構

? ? ? ? 在實際的堆排序中不可以用堆的數據結構來實現,最好用向下排序算法來構建堆的數據結構

代碼如下:

向下調整算法的建堆:

//堆的堆排序操作
void HP_Sort(int* arr, int n)
{//建造堆——通過向下調整算法//n-1是最后一個子結點的下標,i表示的最后一個的父結點的下標for (int i =(n-1-1)/2; i >= 0; i--){HP_DownAdjust(arr, i, n);}//堆排序int end = n - 1;while (end > 0){//交換堆頂和最后一個元素swap(&arr[0], &arr[end]);//向下調整HP_DownAdjust(arr, 0, end);--end;}
}

測試代碼:

void print(int *a,int n)
{for (int i = 0; i < n; i++){printf("%d ", a[i]);}
}
void test3()
{int a[] = { 58, 34, 27, 10, 91, 43, 61, 80, 12 };print(a,sizeof(a)/sizeof(a[0]));printf("\n");printf("排序后:\n");HP_Sort(a, 9);print(a, sizeof(a) / sizeof(a[0]));printf("\n");}

向上調整算法建堆:

//堆的堆排序操作
void HP_Sort(int* arr, int n)
{//建造堆——通過向下調整算法//n-1是最后一個子結點的下標,i表示的最后一個的父結點的下標/*for (int i =(n-1-1)/2; i >= 0; i--){HP_DownAdjust(arr, i, n);}*///建堆——通過向上調整算法for (int i = 0;i < n;i++){HP_UpAdjust(arr, i, n);}//堆排序int end = n - 1;while (end > 0){//交換堆頂和最后一個元素swap(&arr[0], &arr[end]);//向下調整HP_DownAdjust(arr, 0, end);--end;}
}

那么這兩者的時間復雜度有什么區別呢?

? ? ? ? 為了方便推理,我們使用滿二叉樹。因為堆是完全?叉樹,?滿?叉樹也是完全?叉樹,此處為了簡化使?滿?叉樹來證明(時間復雜度本來看的就是近似值,多?個結點不影響最終結果)

? ? ? ? 如下圖所示,
????????

? ? ? ? 每一層有2^(n-1)個結點,需要向上移動n-1次,則需要移動結點總的移動步數為:每層結點個數 * 向上調整次數(第?層調整次數為0)

? ? ? ? 利用數列相關的求和知識可得:

? ? ? ? 由上可知,向上調整復雜度為O(N)

堆的Top-k問題

????????TOP-K問題:即求數據結合中前K個最?的元素或者最?的元素,?般情況下數據量都?較?。

?????????如:專業前10名、世界500強、富豪榜、游戲中前100的活躍玩家等。

????????對于Top-K問題,能想到的最簡單直接的?式就是排序,但是:如果數據量?常?,排序就不太可取了

(可能數據都不能?下?全部加載到內存中)。最佳的?式就是?堆來解決,基本思路如下:

????????1)?數據集合中前K個元素來建堆

????????前k個最?的元素,則建?堆

????????前k個最?的元素,則建?堆

????????2)?剩余的N-K個元素依次與堆頂元素來?較,不滿?則替換堆頂元素將剩余N-K個元素依次與堆頂元素?完之后,堆中剩余的K個元素就是所求的前K個最?或者最?的元素。

//top-k問題
//先建立一個數據
void createData()
{//創建數據int n = 10000;srand(time(0));const char* file = "data.txt";FILE* fp = fopen(file, "w");if (fp == NULL){printf("文件打開失敗!\n");return;}for (int i = 0; i < n; i++){int num = rand() % 10000;fprintf(fp, "%d\n", num);}fclose(fp);
}
void top_k()
{int k = 0;printf("請輸入k:>");scanf("%d", &k); const char* file = "data.txt";FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;};int val = 0;int* minheap = (int*)malloc(sizeof(int) * k);if (minheap == NULL){perror("malloc error");return;}for (int i = 0; i < k; i++){fscanf(fout, "%d", &minheap[i]);}// 建k個數據的小堆for (int i = (k - 1 - 1) / 2; i >= 0; i--){HP_DownAdjust(minheap, k, i);}// 遍歷剩下的n-k個數據int x = 0;while (fscanf(fout, "%d", &x) != EOF){// 如果當前值比堆頂大,替換堆頂并調整if (x > minheap[0]){minheap[0] = x;HP_DownAdjust(minheap, 0, k); }}for (int i = 0; i < k; i++){printf("%d ", minheap[i]);}printf("\n");//free(minheap); // 添加內存釋放fclose(fout);
}
//讀取數據
int main()
{top_k();return 0;
}

? ? ? ? 時間復雜度分析:

? ? ? ? 時間復雜度:O(n) = k + (n - k) log2 k
?

? ? ? ? 本期內容就到這里了,求一個點贊,謝謝

封面圖自取:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90799.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90799.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【csdn問答社區分析】前端開發熱點問題全解析

前端時間我在csdn問答社區的前端部分"視察”了一圈發現了大家的問題主要集中在以下方面一、框架與組件庫使用問題 Vue相關問題 組件化開發&#xff1a;如avue-crud組件自定義樣式不生效、el-select大數據分頁懶加載、element-plus表格動態列校驗等。功能實現&#xff1a;包…

Pycharm2025 安裝教程 免費分享 沒任何套路

Pycharm 安裝也是很簡單的&#xff0c;簡單過一下流程&#xff0c;如果需要的可以轉存下載到自己電腦上。我用夸克網盤分享了「pycharm2025」&#xff0c;復制鏈接瀏覽器打開轉存后即可下載。鏈接&#xff1a;https://pan.quark.cn/s/4bb74a939332備注&#xff1a;附帶2023-202…

Javaweb————什么是超文本傳輸協議?

&#x1f3cd;?&#x1f3cd;?&#x1f3cd;?引言&#xff1a;什么是協議&#xff1f; 協議是一種約定&#xff0c;規定好一種信息的格式&#xff0c;如果發送方按照這種請求格式發送信息,那么接 收端就要按照這樣的格式解析數據,否則就會出錯&#xff0c;這就是協議 常用協…

UniappDay03

1.熱門推薦-準備工作// 用defineProps獲取頁面參數,query const query defineProps<{type: string }>() const currHot hotMap.find((v) > v.type query.type) // 動態設置標題 uni.setNavigationBarTitle({ title: currHot!.title }) </script>2.獲取熱門推…

基于動態增強的 LLM 置信度方法研究

基于動態增強的 LLM 置信度方法研究 一、引言(Introduction) 大型語言模型(LLM)的性能提升高度依賴于對模型內部表征的精準調控 —— 表征工程通過優化模型中間層隱藏狀態的傳遞規律,能夠在不改變模型參數的前提下顯著提升任務適應性(Wei et al., 2022)。當前主流方法中…

ComfyUI中運行Wan 2.1工作流,電影級視頻,兼容Mac Windows

魔當(LM Downloader)是一個大模型應用下載工具 &#xff0c;目前 魔當 已經支持ComfyUI下載Wan 2.1視頻模型。 魔當下載地址 https://seemts.com/ 先看生成效果 原始圖片&#xff0c;你可以保存到自己電腦上測試 生成視頻&#xff1a; 推薦提示詞&#xff1a; A futurist…

CentOS 7 Linux 用 yum 安裝 Docker,含 Docker 鏡像無法拉取問題(即 docker pull 失敗)的解決方案

CentOS 7 Linux 用 yum 安裝 Docker,含 Docker 鏡像無法拉取問題(即 docker pull 失敗)的解決方案 本文對應的講解視頻鏈接:https://www.bilibili.com/video/BV1C48wzqE6T/ 文章目錄 CentOS 7 Linux 用 yum 安裝 Docker,含 Docker 鏡像無法拉取問題(即 docker pull 失敗…

XML的簡略知識點

文章目錄1. 基本概念2. 基本語法3. 示例4. 相關技術5. 應用場景XML&#xff08;可擴展標記語言&#xff09;是一種用于存儲和傳輸數據的標記語言&#xff0c;核心特點是可擴展性和自我描述性。以下是其核心知識點&#xff1a; 1. 基本概念 用途&#xff1a;主要用于數據的存儲…

RustDesk 完整部署教程:支持 Web 管理后臺和網頁客戶端遠程,保姆級教學來了!

RustDesk API本項目使用 Go 實現了 RustDesk 的 API&#xff0c;并包含了 Web Admin 和 Web 客戶端。RustDesk是一個遠程桌面軟件&#xff0c;提供了自托管的解決方案&#xff0c;官方API是收費的&#xff0c;這次咱們用到的是Github開源的第三方API源碼。?特性PC端API支持 …

??GOFLY LIVE CHAT:Golang製オープンソース?ライブチャットシステム?

以下是為日本技術受眾優化的日語版介紹文章&#xff0c;采用IT行業慣用術語和簡潔表達&#xff1a; ??GOFLY LIVE CHAT&#xff1a;Golang製オープンソース?ライブチャットシステム?? ??現代的なカスタマーサポートのための高性能ソリューション?? GOFLY LIVE CHATは…

ISIS GR實驗案例

一、實驗拓撲路由器R1和R2都為雙主控設備&#xff0c;主用板和備用板間形成備份關系。路由器間通過IS-IS協議實現網絡互連&#xff0c;并提供GR機制。要求當R1通過GR方式重啟IS-IS進程或者進行主備倒換時轉發不中斷。1、基礎配置AR1 system sysname AR1 int g 0/0/0 ip add 10.…

智慧農業病蟲害識別準確率↑32%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析&#xff0c;核心技術參數與架構設計引用自《陌訊技術白皮書》&#xff0c;禁止未經授權的轉載與篡改。一、行業痛點&#xff1a;智慧農業的識別困境智慧農業中&#xff0c;作物病蟲害的精準識別是實現精準植保的核心&#xff0c;但田間復雜環境始終…

# JsSIP 從入門到實戰:構建你的第一個 Web 電話

前言 歡迎來到實時通信&#xff08;Real-Time Communication, RTC&#xff09;的世界&#xff01;如果你是一名 JavaScript 開發者&#xff0c;渴望讓你的 Web 應用擁有語音通話、視頻聊天甚至即時消息的能力&#xff0c;那么你來對地方了。這本書是為你量身打造的指南&#x…

【RHCSA 問答題】第 12 章 安裝和更新軟件包

目錄什么是 RPM&#xff1f;dnf 是什么&#xff0c;它和 rpm 有什么聯系和區別&#xff1f;如何設置禁止直接遠程登錄 root 賬戶&#xff1f;RHEL 中如何做才能啟用對第三方存儲庫的支持&#xff1f;怎么理解 RHEL9 中的應用流(Application Streams)和模塊(Modules)&#xff1f…

GEO優化實戰:如何在DeepSeek、豆包等AI平臺搶占推薦位?

在當今競爭激烈的 AI 領域&#xff0c;GEO 優化在搶占 AI 平臺推薦位上的重要性日益凸顯。各大平臺都在為優質內容和企業爭取更好的展示機會&#xff0c;與此同時&#xff0c;一個現象引發了眾人關注&#xff1a;眾多企業大力推薦天津誠智未來公司&#xff0c;這背后究竟隱藏著…

機器學習——隨機森林算法分類問題案例解析(sklearn)

1. 集成學習&#xff1a;三個臭皮匠&#xff0c;如何賽過諸葛亮&#xff1f;我們之前學習的線性回歸、決策樹等算法&#xff0c;就像是團隊里的某一位“專家”。這位專家可能在某個領域很擅長&#xff0c;但單憑他一人&#xff0c;要解決復雜多變的問題&#xff0c;總會遇到瓶頸…

Mermaid流程圖

手動畫流程圖太復雜了&#xff0c;用極少的字符生成圖表是人生的夢想。 Mermaid Chart - Create complex, visual diagrams with text. A smarter way of creating diagrams. Linux開始菜單流程圖 flowchartA(["StartMenu"]) --> B["/usr/share/applicati…

Compose筆記(三十八)--CompositionLocal

這一節主要了解一下CompositionLocal&#xff0c;CompositionLocal是Jetpack Compose中用于組件樹內隱式數據傳遞的核心機制&#xff0c;其設計初衷是解決跨多層組件的數據共享問題&#xff0c;避免通過函數參數逐層傳遞數據。簡單總結:API: (1)compositionLocalOf<T>創建…

解決uniapp 使用uview生成小程序包太大無法上傳的問題

直接打包的插件內容優化后完美上傳&#xff0c; 相信眼尖的小伙伴已經發現了問題的關鍵 uview 會在每個組件里重復引css。導致包太大。 并且 它的格式是 data-v-哈希 沒法簡單的處理 需要壓縮通用規則。然后 再引用壓縮后的規則例如是然后 成功上傳

在線工具+網頁平臺來學習和操作Python與Excel相關技能

&#x1f517;一、在線平臺推薦&#xff08;免安裝&#xff09; ?Python平臺&#xff08;直接寫代碼、跑結果&#xff09;&#xff1a; 平臺 優點 地址 Google Colab 免費&#xff0c;支持圖表和文件操作&#xff0c;最推薦 https://colab.research.google.com …