- 博客(61)
- 收藏
- 关注
原创 BIRCH聚类算法详解(手撕代码)
BIRCH算法全称为「基于层次结构的平衡迭代规约与聚类」,其创新性地将数据归纳与聚类过程融合于树形结构操作。该算法突破性地通过单次数据遍历实现高效聚类,其关键在于构建名为**聚类特征树(CF Tree)**的动态索引结构。
2025-03-29 22:01:30
858
原创 机器学习之多元线性回归
这种最小二乘法,实际上我们可以认为,假定了误差服从正太分布,认为样本误差的出现是随机的、独立的,使用最大似然估计思想,利用损失函数最小化 MSE 就能求出最优解!所以经过说,如果我们的数据误差不是相独立的,或者不是随机器出现的,那么就不适合去假设为正太分布,就不能去用正太分布的概率密度函数带入到总似然的函数中,故而说明了就不能用 MSE 作为损失函数去求解最优解。还在警告假设误差服从泊松分布,或其他分布的那就得用其他分布的概率密度函数去推导损失函数了。
2025-02-23 16:53:29
836
原创 详解TCP的三次握手
第一次握手**:客户端发送 SYN,表示想建立连接,并发送自己的序列号。第二次握手**:服务器发送 SYN + ACK,确认收到客户端请求,并发送自己的序列号和对客户端的确认号。第三次握手**:客户端发送 ACK,确认收到服务器的序列号,并对连接的建立做最终确认。这样,通过三次握手,TCP 连接才能可靠地建立,接下来才能进行数据传输。
2024-09-09 11:08:42
2042
原创 c++中析构函数是否一定要为虚函数
当类要作为基类,并且需要通过基类指针或引用来删除派生类对象时,析构函数应定义为虚函数,以确保派生类的析构函数能够被正确调用,从而避免资源泄漏和潜在的内存管理问题。
2024-09-06 16:07:57
343
原创 虚函数表和虚基表的区别
**虚函数表**用于支持动态绑定和多态性,确保运行时调用正确的虚函数。- **虚基表**用于处理多重继承中的虚继承问题,确保虚基类只被实例化一次。
2024-09-06 15:50:08
880
原创 从前序与中序遍历序列中构造二叉树
力扣——题目运用迭代的方法去求解/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr)
2022-05-28 11:17:04
94
原创 二叉搜索树与双向链表问题
二叉搜索树与双向链表_牛客题霸_牛客网/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: TreeNode* Convert(TreeNode* pRootOfTree) { i
2022-05-28 08:59:22
87
原创 力扣-找公共祖先问题
力扣-找公共祖先问题方法1:看是不是在节点的左右节点,如果在,就说明root即使节点class Solution {public: bool Find(TreeNode* root, TreeNode*x)//找节点 { if(root==nullptr) return false; if(root==x) return true; return Find(root->left,x)||Find(root->
2022-05-27 13:57:31
154
原创 幸运的袋子-牛客网
#include<iostream>#include<vector>#include<algorithm>using namespace std;int getLuckyPacket(vector<int> arr,int size,int pos,int sum,int mulit){ int count=0; for(int i=pos;i<size;i++) { sum+=arr[i]; .
2022-05-15 23:02:29
148
原创 牛客网之参数解析问题
参数解析__牛客网写一个暴力点写法#include<iostream>#include<vector>#include<string>using namespace std;int main(){ vector<string> ans; string str; getline(cin, str); int begin = 0;// int end = 0; int sz = str.s
2022-05-14 22:19:12
158
原创 命名管道的学习
key_t key = ftok(PATH_NAME, PROJ_ID);if(key < 0){perror("ftok");return 1;}
2022-05-02 20:33:40
176
原创 Linux 基础知识详解
今天我们来谈论下优先级的概念,什么是优先级等。概念:就是CPU分配资源的先后顺序,也就是指挥进程的优先权限。优先权高的进程有优先执行的权力,优先级越高的进程,起先被执行。现在我们看下,我们怎么查看进程的。当你在运行一个进程的时候,用命令 ps -al 查看是优先级的,其中PRI是优先级,其值越小,优先级越高,NI是nice值,其作用就是用来调整优先级的,如果NI是负数,会让其优先级增加,如果是正数,就会让优先级下降,其NI值的取值范围是-20-19;PID是这个进程的编号,PPID是父进程的
2022-04-04 13:09:06
465
原创 进程的概念(详解)
首先我们来讨论下,进程和程序的区别,有些人说进程就是存储在内存的程序,其实这样的说法是不正确的,其实进程是程序加PCB(数据管理模块),就是进程信息被存放在一个加控制模块的数据结构中,可以理解为进程属性集合。接下来我们来学习下一个重要的函数:fork函数fork函数其作用就是创建一个子进程,首先我们创建一个子进程的方法有两种,一个是cmd or run command fork ,在操作系统的角度上讲,上面建立的进程方式没有什么不同。fork的本质是创建进程,那么它是不是一定会导致系统里多一个进
2022-04-03 11:51:19
443
原创 手撕vector
#pragma once#include<iostream>using namespace std;namespace WGX{ template<class T> class vector { public: typedef T* iterator; typedef const T* const_itreator; vector() :_start(nullptr) , _finsh(nullptr) , _endofstor.
2022-04-01 17:16:51
418
原创 vim的基本用法
现在目录下面创建一个文件,我们现在创建一个test.c文件然后用vim文件打开进入编辑界面,vim最重要有三种模式,一种是命令模式,一种是低行模式,插入模式,所以我们现在要掌握怎么进行三种模式的切换。首先我们一打开vim默认的模式就是命令模式,如果我么要进入低行模式的话,按shift+:,进入低行模式我们可以按w+q,来进行退出,其中w是保存,q是推出,还有一点如果加!就是强制的意思。我们怎么从命令模式进入插入模式呢,那么我们按“i”就可以了,在插入模式里面我们可以输入你想输入的东西。但有一
2022-03-27 12:19:52
697
原创 电话号码组合(力扣)
这样的题目其实就是提多叉树的遍历,一直向下,然后从左向右遍历。class Solution { string arr[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};//把所有的组合列出来public: void _letterCombinations(const string& digits,size_t i,string Cominstr,vector<string>& s...
2022-03-25 12:50:37
365
原创 C++之string源代码详解
stiring 相比于c的char 要方便多了,string里有很多的库函数,现在我们来把库函数的实现讲解下#include<iostream>#include<string.h>#include<assert.h>using namespace std;namespace WGX//建一个空间域{ class string { public: typedef char* iterator;//迭代器 typedef const cha
2022-03-19 14:01:51
3785
原创 c++之模板初阶
目录1.泛型编程2 函数模板3 类模板1.泛型编程怎么去实现一个通用的交换函数呢,如果我们要交换int,或者double,再或者char,如果这样,我们是不是要写三个不同的函数,这样就很鸡肋,很多代码是复用的,怎么想着去简化它呢,于是大佬们就想到了一个方法。下面是重复的函数void Swap(int& left, int& right){int temp = left;left = right;right = temp;}void Swap(double
2022-02-22 10:57:50
615
原创 C++之引用详解
引用的概念:引用没有重新定义一个变量,只是给变量取了个别名,编译器不会给引用名重新开辟空间,它和它的应用变量共同使用一个内存空间。类型&引用变量名==引用实体;void TestRef(){int a = 10;int& ra = a;//<====定义引用类型printf("%p\n", &a);printf("%p\n", &ra);}引用的特性:1.引用在定义时必须初始化.2.一个变量可以有多个引用3.引用一旦引用了一个实体
2022-01-14 11:23:00
322
原创 牛客网—二叉树遍历(C语言)
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。输入描述:输入包括1行字符串,长度不超过100。输出描述:可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。示例1输入:abc##de#g##f###
2022-01-14 01:07:43
300
原创 力扣—对称二叉树(C语言)
主要的思想就是,看看其左子树的值和右子数的值相不相等,如果相等就递归后面的左子树和右子树。/** * Definition for a binary tree node. * struct TreeNode {//创建的结构体 * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */bool _isSymmetric(struct TreeNode* root1,struct...
2022-01-14 01:01:50
383
原创 力扣-平衡二叉树(C语言)
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。左子树的高度和右子树的高度相差不能大于1,所以只需要求出做左子树的深度和右子树的深度,再看看它们相差是不是大于1。代码实现**e. * struct TreeNode {//创建一个结构体 * int val; * struct TreeNode *left; * struct TreeNode *...
2022-01-14 00:54:55
154
原创 力扣(反转二叉树)C语言
如图所示,可以利用前序遍历实现这个功能。void _invertTree(struct TreeNode* root){ if(root==NULL) { return NULL; } struct TreeNode*tmp=root->left; root->left=root->right; root->right=tmp; _invertTree(root->left); _in...
2022-01-11 13:46:47
338
原创 力扣(两数相加)C语言
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头如图所示:解题思路,如果两个链表的长度都相等,那比较简单,直接加就可以了,难的是长度不相等,怎么处理这不相等情况,有一种方法是,将短的后面补零,再进行相加。/** * Definition for singly-linked list. * struct
2022-01-11 10:44:49
381
原创 C++之默认参数详解
下面将介绍另一项新的内容--默认参数。默认参数指的是当函数中调用中缺省了实参自动使用一个值,比如下面程序:void Print(int a=1){ cout<<”a的值:“<<a<<endl;}此时如果不给参数,打印的就是1,如果给了其他的数,就打印其他的数。其实,默认参数可以分为两种,一种是全缺省参数,一种是半缺省参数。即全缺省参数就是所有参数都缺省了,都有默认值,半缺省就是一部分有默认值,一部分没有。首先我们先来我们来看下全缺省的情况:
2022-01-08 13:02:48
5113
原创 排序之选择排序(图解)
选择排序的思想其实比较简单,每循环一遍,就找到一个最小的或最大的,找到最小的,就和最左边的换,找到最大的就和嘴右边的换,如下图所示:此图是找小的,每次遍历一遍就把找到最小的放在左边,直到结束。其实我们可以优化代码,同时找到最大的喝最小的,把最大的放在右边,最小的放在左边,如此循环下去。void selectSort(int* a, int size){ //选择排序的思想就是每一次找到一个最大的,放到最后面,找到一个最小的放到最前面 int left = 0;//定义最左边的下标 in
2022-01-06 17:26:08
3065
2
原创 排序之希尔排序(图解)
为什么希尔排序会出来,主要是为了弥补插入排序的缺点,插入排序它的最好的时间复杂的为O(n),但如果一开始是一个逆序出来让我们排,那时间复杂度就是O(n^2)了,因为每次排,都会移动所经过的数。希尔排序其实也是插入排序的变形,就是在做最后一部插入排序之前,做一个预排序,使它先接近有序,然后再排。void shellSort(int* a, int size){ int gap = size; while (gap > 1) { gap = gap / 3 + 1; f.
2022-01-06 14:14:18
1436
原创 排序之插入排序(图解)
插入排序就像我们打扑克一样,在理排的时候,如果有新牌,就会一个一个比较,看谁的大。代码如下#include<stdio.h>#include<assert.h>void Swap(int* px, int* py)//交换数据{ int tmp = *px; *px = *py; *py = tmp;}MyPrint(int* a, int sz)//打印数组{ for (int i = 0; i < sz; i++) { prin.
2022-01-06 08:50:39
334
原创 求链式二叉树第K层的结点数
之前我们写过怎么求叶子结点的个数,叶子结点个数就是求它的左子树的叶子结点,加上柚子树的叶子结点,依次递归下去,可能最难得就是跳出递归的条件,由于是求叶子结点,所以当它的左右子树都为空的时候就返回1,如果是空的树就返回零。同样的,我们要找K层的节点数,所以我们每遍历一层就k-1最后当k==1的时候,就到了第K层了,所以这就是我们的终止递归的条件。#include<stdio.h>#include<stdlib.h>#include<assert.h>typede
2021-12-23 15:58:40
1870
原创 判断单值二叉树的详解与实现(c语言)
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回true;否则返回false,如图所示:那如何证明它是单值二叉树呢,我们是不是可以把大问题化成小问题来解决。比如,我们先比较头结点和左右子结点的值。然后依次往下递归。bool isUnivalTree(struct TreeNode* root){ if(root==NULL)//如果为空就返回真 { return true; } if(r...
2021-12-22 16:54:55
672
原创 (力扣)循环队列的实现与详解(C语言)
循环队列是一种线性数据结构,其操作表现基于FIFO(先进先出)原则,并且队尾被连接在队首之后以形成一个循环。它也被称之为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间,在普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即是在队列前面仍有空间。但是在使用循环队列,我们能使用这些空间去存储新的值。如图所示,可以形象的理解为这样的队列。但我们在实现循环队列的时候,可以用数组实现,也可以用链表来实现,那我们接下来就先试试怎么用数组来实现这个循环队列。此时我..
2021-12-21 17:12:18
970
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人