- 博客(27)
- 收藏
- 关注
原创 你真的懂排序算法吗?带你理解数论中排序本质,为什么希尔排序效率竟然如此之高?
关于排序,我们从冒泡讲起:首先,我们写一个最简单的插入排序,这个是最最基础,也是所有人看到排序问题最直接的想法//直接插入排序函数void InsertSort(int a[], int n){ for(int i= 1; i<n; i++){ if(a[i] < a[i-1]){//若第 i 个元素大于 i-1 元素则直接插入;反之,需要找到适当的插入位置后在插入。 int j= i-1; int x = a
2021-04-22 11:41:50
771
3
原创 cmake简单实用
PROJECT(HELLO) //构建项目名SET(SRC_LISTmain.c) //设置变量方法MESSAGE(STATUS"ThisisBINARYdir"${HELLO_BINARY_DIR}) //显示消息方法MESSAGE(STATUS"ThisisSOURCEdir"${HELLO_SOURCE_DIR})ADD_EXECUTABLE(hello${SRC_LIST}) //使用变量方法...
2021-04-20 18:10:47
115
原创 Mysql的C库
大家好,今天先带着大家熟悉一下mysql的c库,后面我们会把他封装成c++形式1.连接函数:mysql_real_connect;2.设置超时连接,设置断开之后重连(防止阻塞时间过长)3.查询语句:mysql_real_query 注意:执行sql语句后,必须获取结果集并且清理!4.获取结果集:mysql_store_result/mysql_use_result5.MYSQL_ROW结构体:char**,字符串的数组6.遍历结果集:mysql_fetch_row;7.清理结果.
2021-04-20 16:56:58
518
原创 mysql背诵进阶用法
1.视图当你在多个表格联接时,为了方便使用,给连接的结果起个别名,就是视图;视图本身并不包含数据,如果你把数据改了,则视图返回的是新的数据;1.用法:试图最常用的用法之一是隐藏复杂的sql语句,这些通常都会涉及到链接:这条语句创建了一个视图,使用了CREATE VIEW 关键字2.从视图中检索:3.用视图来代替复杂的别名列:4.视图在某些情况下也可以进行添加和修改,具体参加文档2.存储过程存储过程就像一个脚本文件,他是一系列sql语句的合集1.执行存储过程,所
2021-04-18 17:08:02
114
原创 每日背诵mysql高级语句
老规矩,首先写出本文用到的两个表格,第一个表格为学生信息student_info,第二个表格为学生家庭状况student_family表1student_info表2student_family1.子查询子查询有一个重要运用,就是通过子查询连接两个关系表1. 查找数学86分和65分的同学的国家:select country fromstudent_family in(select id from student_info where math=(86,65)); ...
2021-04-17 15:41:20
74
原创 每天背mysql语句及知识点
1.useXXX;2.show databases;3.show tables;4.show columns from xxx;5.检索某些列(select xx from xx);6.检索某些列,只显示该列不同的值(distinct) 注:distinct必须在每个列前面都加一个,否则出错;7.限制只输出列的前几行(select xx from xx limit 5);限制只输出列的从某一列开始的前几行(select xx from xx limit 5,5); 注:他...
2021-04-14 18:58:31
172
原创 认真背算法day05
今天写一下回溯算法。关于回溯算法,我认为回溯本质而言就是一个递归(一个深度遍历DFS),只不过这个递归过程看好是遇到不合适的就往回走,然后继续遍历。那么如何选取到最合适的解决方案呢,那就是在遍历的过程中加入一个“记事本”,这个记事本用来记录当前已经拿到的最好的结果,在后续的遍历过程中,如果有更好的结果,就把当前结果进行替换。但是递归的复杂度太高了,有没有什么好的解决办法呢,就是加上剪枝过程,根据实际题目条件加上限制用来剪枝,让不必要的遍历直接跳过。一个典型的背包问题0-1问题,就是可以用回溯来解
2021-03-16 18:48:26
137
原创 认真背算法day04
好久没更新算法了,今天再更新一天。今天主要复习一下trie树和ac自动机1.trie树Trie 树,是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。trie树的记录方法:每一个节点,都记录其所有可能出现的字符,以一个数组形式组织,数组中存放节点。具体组织形式如下:public class Trie { private TrieNode root = new TrieNode('/'); // 存储无意义字符 // 往Tr.
2021-03-15 18:41:48
119
原创 认真背算法day03
昨天高强度背了BM算法和KMP算法,今天整点阳间的休闲一下。今天主要讲两个东西,一个是堆排序,一个是图的深度遍历(回溯算法)和广度遍历。堆排序为什么堆这么重要呢?因为堆是可以用数组表示的,假设堆上某个节点在数组中下标为i,则其左右孩子节点的下标为i*2和i*2+1。下面讲解堆排序的思路:我看过网上很多文章,我认为他们都没有讲清楚堆排序,其实堆排序就一个很重要的操作,叫做堆化(heapify)堆化其实本质是说这样一件事:假如有一个完全二叉树,它的根节点的左右子树都是堆,那么经过堆化,这
2021-03-10 20:23:23
90
原创 认真背算法day02(续)--kmp算法
字符串匹配怎么能少了大名鼎鼎的kmp算法呢?概念:好前缀:直到遇到坏字符为止,最长的前缀子串。好前缀的所有后缀子串中,最长的可匹配前缀子串的那个后缀子串,叫作最长可匹配后缀子串;对应的前缀子串,叫作最长可匹配前缀子串直接上思路:1.KMP算法和bm算法完全相反,kmp算法采用从前到后进行比较。2.kmp算法主要是为了找:最长可匹配后缀子串(最长可匹配前缀子串)。3.KMP 算法也可以提前构建一个数组,用来存储模式串中每个前缀(这些前缀都有可能是好前缀)的最长可匹配前缀子串的.
2021-03-09 23:51:10
112
原创 认真背算法day02--字符串比较(使用java)
字符串的几个经典算法可以说都是很令人头疼的,下面主要背四个1.暴力解法这个就不讲解了,因为实在太暴力了,代码也很简单。但是这里要讲几个重要概念:主串和模式串:比方说,我们在字符串 A 中查找字符串 B,那字符串 A 就是主串,字符串 B 就是模式串。我们把主串的长度记作 n,模式串的长度记作 m。因为我们是在主串中查找模式串,所以 n>m。后缀字串和前缀子串:字符串“abcdefg”,后缀字串为:“g”,"fg","efg"等等;前缀子串为:"a","ab","abc"等等。
2021-03-09 22:29:46
113
原创 认真背算法Day01
有些算法是一定要背下来的,为了方便背诵,总结了每种算法的要点。1.排序这里主要讲解归并排序和快速排序,为什么主要讲这两个呢,因为这两的时间复杂度都是o(nlogn),其次他们都是采用了递归的思想。为了背下来这两个算法,就需要深刻理解递归。所有的递归问题,本质都可以分为三点:1.一个大问题,可以分解为若干有限个小问题;2.这些被分解出来的小问题,除了在数据规模上低于大问题,问题内容和解决思路完全和大问题一致;3.存在递归终止条件,不然会爆栈。1.1归并排序思想:归并排...
2021-03-08 22:08:09
176
原创 深入理解Unicode,UTF编码和wchar_t(适合初学者)
预备知识1.什么是Unicode字符集?一、ASCII 码我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从00000000到11111111。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为 ASCII 码,一直沿用至今。ASC
2020-11-07 18:05:44
1554
转载 单调栈和单调队列(看完100%明白,适合初学者)
这里分别分享两篇文章,都是初学者能看懂的单调栈和单调队列的讲解1.单调栈:https://blog.csdn.net/lucky52529/article/details/891556942.单调队列:https://www.luogu.com.cn/blog/ybwowen/dan-diao-dui-lie
2020-11-02 23:24:02
125
原创 如何通过函数名的字符串运行函数(从dll动态库谈起,使用c++)
1.问题描述 比如现在有一个函数叫MyFunc,现在想通过函数名调用该函数,该怎么办呢?2.概述 这个问题需要用到c++动态库dll的创建和解析,通过这两个知识点,可以解决以上问题,下里面我们详细讲述3.dll库的动态调用和解析生成动态链接库(dll文件)1、使用VS生成动态链接库的步骤:(1)新建一个win32控制台工程,并在应用程序设置窗口中选择“Dll”选项,附加选项选择“空项目”。如下图:(2)创建完工程之后,添加源文件,在源文件中写上想导出到dll...
2020-10-25 11:01:06
1595
转载 一篇文章教你理解什么是静态库和动态库
https://www.cnblogs.com/skynet/p/3372855.htmC++静态库与动态库这次分享的宗旨是——让大家学会创建与使用静态库、动态库,知道静态库与动态库的区别,知道使用的时候如何选择。这里不深入介绍静态库、动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书《程序员的自我修养——链接、装载与库》。什么是库库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库
2020-10-20 22:43:57
2857
转载 太厉害了!解决了我对编译的绝大部分问题!
https://blog.csdn.net/weixin_42018112/article/details/82357002
2020-10-19 23:57:52
641
原创 一文让你理解:static关键字的全部作用(正确性100%)
1.先来介绍它的第一条也是最重要的一条:隐藏。(static函数,static变量均可)当同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。举例来说明。同时编译两个源文件,一个是a.c,另一个是main.c。//a.cchar a = 'A'; // global variablevoid msg(){ printf("Hello\n");} //main.c (void)msg();//函数声明int main(){ e.
2020-10-19 22:23:40
273
原创 最长连续不重复子序列
最长连续不重复子序列给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续子序列,输出它的长度。#include <iostream>#include <unordered_map>#include <algorithm>using namespace std;const int N = 5;int maxarray(int* a){ int j = 0; int res = 0; unordered_map<int, int
2020-10-19 20:15:23
130
原创 求一个数的三(二)次方根,一次解决所有类似问题,采用二分思想
问题给定一个数,求其三次方跟实例输入27输出9解法此类为典型的二分法题目,二分题目首先要确定判断标准,此处判断标准为x的三次方<=a,有了判断标准,可以写出代码c++#include <iostream>using namespace std;float root(float a){ float left = -a; float right = a; while(right-left>1e-6) { float mid = (.
2020-10-18 17:46:13
129
原创 剑指offer之逆序对的个数(使用归并排序)
题目题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007。输入描述题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据,size<=2*10^5示例1,2,3,4,5,6,7,0 结果是 7思路一看到这个题我就
2020-10-17 19:34:29
123
原创 查找数组中第K大的数,使用快排(可能是最易懂的写法)
给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列从小到大排序后的第k个数。下面给出代码并讲解:#include <iostream>#define swap(a,b) {int temp=a;a=b,b=temp;}using namespace std;int partition(int* a, int left, int right)//快排中最核心的步骤,把数组中最右边的数作为分割点进行分割,每次分割返回值i为当前第i-left+1大的数{.
2020-10-17 18:29:17
620
原创 大整数相减,相乘算法
#include <iostream>#include <vector>#include <algorithm>using namespace std;bool cmp(vector<int> &a, vector<int> &b)//a>b return ture{ if (a.size() > b.size()) return true; if (a.size() < b.size()) r.
2020-10-15 21:40:03
78
原创 两个大位数相加
#include <iostream>#include <vector>using namespace std;vector<int> add(const vector<int> &a,const vector<int> &b){ vector<int> c; int i, j, k; i = 0; j = 0; k = 0; for (;i<a.size()||i<b.size();i.
2020-10-14 20:51:44
74
原创 二分法的模板
#include <iostream>#include <vector>using namespace std;int test1()//整数二分求4的下标区间{ vector<int> q = { 1,2,3,4,4,4,5,6,7 };//下标为0-8 int l = 0; int r = 8; while (l < r) { int mid = (l + r+1) / 2; ...
2020-10-14 20:50:37
77
原创 一篇文章教你永久理解:大端模式和小端模式
1.什么是大/小端模式:比如一个整型数字:0x 12 34 56 78(4字节),在内存中是以字节为单位进行存储的, 大端模式从内存低地址到高地址存储为:0x 12 34 56 78(低地址存放的是高位数据), 小端模式完全相反,从内存低地址到高地址存储为:0x 78563412(低地址存放的是低位数据), 注意每一个字节内部的排列顺序不变。2.写一个程序验证你的机器是大端还是小端?(现代计算机一般为小端模式) 1 #include <stdio.h&...
2020-10-11 15:19:37
128
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人