- 博客(72)
- 资源 (3)
- 收藏
- 关注
原创 计算算法的运行时间,精确到us(c、window、vs2019)
#include<stdio.h>#include <windows.h>#include <iostream>#include <thread>#include<ctime>//计时部分初始化double run_time;_LARGE_INTEGER time_start; //开始时间_LARGE_INTEGER time_over; //结束时间double dqFreq; //计时器频率LARGE_IN
2022-02-23 18:51:11 542
原创 c++ 三个线程轮流打印ABC
#include<iostream>#include<thread>using namespace std;#include<condition_variable>condition_variable cv;mutex m;int flag = 0;void fun_a(){ unique_lock<mutex> lk(m); cout << "fun_a" << endl; int count = 0; wh
2021-08-27 17:04:55 1117
原创 算法合集(图片上不来)
设计模式单例模式它的核心结构只包含一个被称为单例的特殊类。它的目的是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方都需要这样的功能模块,如系统的日志输出,操作系统只能有一个窗口管理器,一台PC连接一个键盘等。核心:全局只有一个实例:static 特性,同时禁止用户自己声明并定义实例(把构造函数设为 private)线程安全(可以通过加锁实现,但用局部静态变量更好)禁止赋值和拷贝用户通过接口获取实例:使用 static 类成员函数避免内存泄漏(可
2021-08-16 11:38:01 359
原创 数据结构与算法-TOP-k问题
TOP-k 问题这道题如果要求时间复杂度优先可以考虑快排变形,如果空间复杂度优先,可以使用堆排。下面给出了三种方法,第一种自己实现了一个堆结构,第二种用的stl的优先队列,第三种用了快排模板的变形。堆的解决方法虽然速度不一定有快排快,但对于海量数据,本地不需要存储那么多数据方法1:手写堆class Solution {public: vector<int> smallestK(vector<int>& arr, int k) { .
2021-07-27 21:26:07 201
原创 数据结构与算法-归并排序模板记忆
通过递归的方式将大的数组一直分割,直到数组的大小为 1,此时只有一个元素,那么该数组就是有序的了,之后再把两个数组大小为1的合并成一个大小为2的,再把两个大小为2的合并成4的 … 直到全部小的数组合并起来。整体的思想是分治,即先使每个子序列有序,再使子序列段间有序将数组元素拆分成个体,然后两两合并成一组,以此类推递归注意结束条件、递归公式先递归,再合并1.完成数组拆分,直到拆成单个元素2.完成两个分别有序子序列合并得功能函数#include<iostream>using
2021-07-27 15:25:06 81
原创 数据结构与算法-快速排序模板记忆
快排的边界问题太容易出错了,所以写一个模板背下来分析:1.选一个哨兵 这里选x = nums[left + right >> 1];这个哨兵最好不要随意改变,要么容易出现边界问题要么容易超时.2.快排的核心是分治 即将一个序列左部分小于等于x 右部分大于等于x3.设置两个指针left right 分别从两端开始,left遇到大于等于x的停下来,right遇到小于等于x的停下来,然后如果i<j 就交换nums[i] nums[j]void quick_sort(int nums[
2021-07-27 11:18:10 146
原创 数据结构与算法-堆排序
堆的特点: 完全二叉树+父节点值大于子节点完全二叉树的重要性质: 将完全二叉树的节点按照层序遍历的顺序依次输入到一个数组中,那么任意一个子节点和父节点在数组中的索引有如下数量关系parent=(i-1)/2c1=2i+1//左孩子c2=2i+2//右孩子核心思想:输入一个乱序数组,将他按照层序遍历的顺序逐个填成一个完全二叉树,然后把这棵完全二叉树变成一个大根堆,然后得到当前的最大值,交换到数组的末尾,然后再重复操作,又搞成一个大根堆。再次交换,重复上述过程直到所有元素都排好序。整体步骤分三步.
2021-07-27 00:16:12 167
原创 回溯算法模板总结+力扣原题解析
回溯算法复杂度分析回溯本质是遍历所有可能的情况,所以复杂度会比较高,但可以通过剪枝来优化。子集问题:由于每个元素只有选择或者不选两种,所以遍历到每一种情况,时间复杂度为O(2^n),再加上构造的每一组子集都需要放入数组,需要o(n),所以总共O(n * 2^n).空间复杂度,递归深度n,系统栈所用空间O(n);排列问题:时间复杂度O(N!),第一层n个分枝,第二层每个分支又有n-1分支。所以nn-1n-1…*1=n!,空间复杂度O(N)组合问题:组合问题就是一种子集问题(组合一般限制元素个数)回溯
2021-07-20 10:29:14 831
原创 平分物品(网易2021校招笔试提前批)(dfs)
题目:现在有n个物品,每一个物品都有一个价值,现在想将这些物品分给两个人,要求这两个人每一个人分到的物品的价值总和相同(个数可以不同,总价值相同即可),剩下的物品就需要扔掉,现在想知道最少需要扔多少价值的物品才能满足要求分给两个人。这道题我认为是选择问题 通过dfs每一种可能的选择,找到所有可能的解法题意转换 将题意转换很重要,题目是求最少丢掉多少物品能够平分给两个人,转换为两个人从0开始拿,计算出所有满足平分条件的最值(最少丢弃)具体步骤首先将题目转换为两个人从0开始拿物品,对
2021-07-14 14:32:30 1202
原创 基于ffmpeg和SDL的音视频播放器
基于ffmpeg和SDL的音视频播放器花了挺长时间给代码加了超级详细的注释实现的功能:音视频同步播放一.播放器的多线程模型本文从播放器的多线程的模型开始分析播放器的源码1.主线程我们的设计思路是主线程不添加过多的业务逻辑,专注于SDL事件的响应,提高用户的响应速度 首先要介绍一个超级重要的结构体VidoeState,这里面存放了视频文件的信息(上下文、解码器、各种参数等)和写代码过程中要使用的数据结构(队列、index、锁等),这个结构体要作为函数参数把各个线程串起来。主线程首先做了一些初
2021-05-30 22:10:48 389
原创 数据结构与算法-- 排序
快速排序核心思想:参考链接https://developer.51cto.com/art/201403/430986.htm/*1.先从数列中取出一个数作为基准数。1.1 直接取第一个元素2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。2.1 两个指针i,j分别指向头尾,相向而行。先移动j,直到j找到一个小于等于基准数的,i找到一个大于基准数的,交换他们。2.2 继续2.2 直到i=j ,交换这个位置和首元素3.再对左右区间重复第二步,直到各区间只有一个
2021-04-06 22:14:23 133
原创 数据结构与算法--二分查找
核心思想:一般查找有序序列中的某个元素可以采用二分查找基本公式:mid=1+(R-L)/2求开方69. Sqrt(x) (Easy)题目描述给定一个非负整数,求它的开方,向下取整。输入输出样例输入一个整数,输出一个整数。Input: 8Output: 28 的开方结果是 2:82842:::,向下取整即是 2。核心思想:while结束的条件为L>R,初始L为0,R为a,mid为1+(R-L)/2 ,sqrt为a/mid;若sqrt大于mid,则将L赋值为mid+1,若sqrt小于
2021-04-04 14:55:43 459
原创 数据结构算法---双指针
算法核心思想:双指针多用于遍历数组,可以同时遍历一个数组或分别遍历不同的数组。常见的设计思想如下:对于排序后的数组,双指针分别指向数组的头尾,遍历方向相反,用于搜索。双指针指向两个数组,分别遍历快慢指针滑动窗口两数之和167. Two Sum II - Input array is sorted (Easy)题目描述在一个增序的整数数组里找到两个数,使它们的和为给定值。已知有且只有一对解。输入输出样例输入是一个数组(numbers)和一个给定值(target)。输出是两个数的位置,从
2021-03-21 20:51:49 460
原创 数据算法---贪心算法
算法核心思想采用贪心的策略,保证每次操作都是局部最优的,最终达到全局最优。分配问题455. Assign Cookies (Easy)题目描述有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃最多一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子可以吃饱。输入输出样例输入两个数组,分别代表孩子的饥饿度和饼干的大小。输出最多有多少孩子可以吃饱的数量。Input: [1,2], [1,2,3]Output: 2思路:在这个样
2021-03-15 11:16:19 264
原创 操作系统复习
一.操作系统1.进程与线程的区别?一个进程由PCB(进程控制块)、数据段、代码段组成,进程本身不可以运行程序,而是像一个容器一样,先创建出一个主线程,分配给主线程一定的系统资源,这时候就可以在主线程开始实现各种功能。当我们需要实现更复杂的功能时,可以在主线程里创建多个子线程,跟人多好干活的道理一样,多个线程在同一个进程里,利用这个进程所拥有的系统资源合作完成某些功能。2.同一进程的多线程中哪些是独有的,哪些的共享的?独有:栈(但没有保护机制,只要栈上的指针被别的线程拿到,就可被修改)、局部变量、寄存
2021-03-06 20:33:33 256
原创 ffmpeg实现简单的音频编码
音频使用的不多,大致流程跟视频编码差不多#include <stdint.h>#include <stdio.h>#include <stdlib.h>#include <libavcodec/avcodec.h>#include <libavutil/channel_layout.h>#include <libavutil/common.h>#include <libavutil/frame.h>#in
2021-01-07 15:49:10 330
原创 ffmpeg实现简单视频解码(将视频文件分解为单张RGB图片)
参考链接官网https://ffmpeg.org/doxygen/3.4/decode_video_8c-example.htmlhttps://blog.csdn.net/u014162133/article/details/81131339核心流程及API//处理输入/* register all formats and codecs */av_register_all();/* open input file, and allocate format context */avform
2021-01-06 21:37:49 1098 1
原创 ffmpeg 实现初步视频编码
参考资料编解码API详解(这个博主写的还挺多,有时间可以看看)https://www.cnblogs.com/leisure_chn/p/10584925.html官网demohttp://ffmpeg.org/doxygen/trunk/encode__video_8c_source.html直接上代码吧#include <stdio.h>#include <stdlib.h>#include <string.h>#include <libavc
2020-12-30 11:18:38 201 1
原创 ffmpeg实现两个文件的音频、视频流抽取与合成(小咖秀)
整体思路简要分析1.初始化准备工作分别打开文件 探测信息给AVstream等一些空白参数赋值avformat_open_inputavformat_find_stream_info创建输出上下文根据文件名分配合适的输出文件AVFormatContext 管理结构avformat_alloc_output_context2寻找第一个视频中最好的音频流和第二个文件中最好的视频流,并返回流的索引av_find_best_stream2.准备输出内容创建音频输出流(视频同理)avforma
2020-12-29 14:36:14 1004
转载 ffmpeg知识整理
一:ffmpeg的模型1:转码模型转码基本流程:flv格式数据–>h264/aac数据–>yuv/pcm数据–>h264/aac数据–>mp4格式数据。a:我们把flv格式数据或者mp4格式数据这一层叫做mux/demux层或者复用层有些人习惯于叫做封装层,这里叫做mux/demux层下面同理。b:我们把h264/aac数据这一层叫做编解码层或者codec/decode,这里叫做codec/decode层下面同理。c:我们把yuv/pcm数据这一层叫做原始数据层或者Raw
2020-12-29 13:15:19 355
原创 leetcode第26题--删除排序数组中的重复项(c、c++实现)
题目描述:给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回新的长度 5, 并且原数组
2020-12-20 15:11:35 205
原创 ffmpeg 视频封装格式转换(ex:flv mp4 mkv mov互转)
这个代码是不改变音视频的编码格式的,只改变封装格式,源文件为MP4(h264+acc),那么理论上支持h264+acc的封装格式都可以互转#include <libavutil/timestamp.h>#include <libavformat/avformat.h>static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt, const char *tag){ AVRatio
2020-12-18 20:29:55 1635 1
原创 抽取一个多媒体文件中的视频流
核心流程:打开mp4文件并打开目标文件用于存储H264数据fopen(dst_fileName, “wb”);err_code = avformat_open_input(&fmt_ctx, src_fileName, NULL, NULL);初始化 AVPacketav_init_packet(&pkt);//找到最好的video流video_stream_index = av_find_best_stream(fmt_ctx, AVMEDIA_TYPE_VIDEO, -1,
2020-12-15 22:15:54 194
原创 Leetcode第一题--两数之和(两种解法、两种语言实现)
1.题目描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]2.暴力解法(时间复杂度O(n*n))暴力解法没什么好说的,两个for遍历,就是注意他是要两个不同的元素且一个元素不能重复使
2020-12-10 17:23:48 316 3
原创 两种方法实现抽取一个视频文件中音频流(基于ffmpeg)
使用到的ffmpeg APIav_log_set_level() 设置日志打印的标准, 高于这个标准的将不会打印av_log() 打印ffmpeg中的日志,当做printf用av_dump_format()av_register_all()avformat_open_input()avformat_close_input()av_find_best_stream()av_init_packet()av_packet_unref()av
2020-12-07 22:02:31 820
转载 FFmpeg 中比较重要的函数以及数据结构
FFmpeg 中比较重要的函数以及数据结构如下:数据结构:(1) AVFormatContext(2) AVOutputFormat(3) AVInputFormat(4) AVCodecContext(5) AVCodec(6) AVFrame(7) AVPacket(8) AVPicture(9) AVStream初始化函数:(1) av_register_all()(2) avcodec_open()(3) avcodec_close()(4) av_open_i
2020-12-07 10:00:27 569
原创 ffmpeg基本目录、文件、日志操作
main.c#include <stdio.h>#define __STDC_CONSTANT_MACROS#ifdef __cplusplusextern "C" {#endif#include <libavcodec/avcodec.h>#include <libavformat/avformat.h>#include <libavfilter/avfilter.h>#include <libavutil/log.h>#i
2020-12-05 21:41:09 1232
原创 C语言多线程_生产者与消费者模型_链式队列实现
代码中有详细注释,详见readme.txtcmakelistcmake_minimum_required(VERSION 3.17)project(A)set(CMAKE_CXX_STANDARD 14)add_executable(A fun.cpp final.cpp)#add_executable(A queue.c)find_package(Threads REQUIRED)target_link_libraries(A Threads::Threads)fun.cpp
2020-12-01 19:58:30 640
原创 顺序队列的读写
代码中有详细注释cmakelistcmake_minimum_required(VERSION 3.17)project(A)set(CMAKE_CXX_STANDARD 14)add_executable(A fun.cpp final.cpp)#add_executable(A queue.c)find_package(Threads REQUIRED)target_link_libraries(A Threads::Threads)fun.cpp#include <
2020-12-01 19:54:46 171
原创 编写cmakelist支持需要的ffmpeg库
直接使用gcc 编译main.c,g++ -o main main.cpp -l avutil-l avutil 为日志函数所依赖的库,每次编译都需要指定所依赖的库使用cmake工具,自动生成makefile,配置cmakelist,使其支持ffmpeg动态库和静态库代码中附详细注释cmakelistcmake_minimum_required(VERSION 3.17)project(ffmpeg_demo)# 设置ffmpeg依赖库及头文件所在目录,并存进指定变量set(ffmpeg
2020-11-27 09:31:48 4377 2
原创 liunx系统编程知识点
1.linux系统 内存管理1、物理地址、线性地址(虚拟地址)和逻辑地址之间的关系物理地址是指出现在cpu外部的地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。逻辑地址是程序代码经过编译后在汇编程序中使用的地址。线性地址又名虚拟地址,在32位cpu框架下,可以表示4G地址空间,用16进制表示就是0x00000000到0xffffffff。2.内存管理Linux内核的设计并没有全部采用Intel所提供的段机制,仅仅是有限度地使用了分段机制。这不仅简化了linux内核的设计,而且为把li
2020-11-22 22:40:29 339
原创 vs链接动态库
与DLL模块建立链接应用程序导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。所谓的隐式链接是指在应用程序中不需指明DLL文件的实际存储路径,程序员不需关心DLL文件的实际装载。而显式链接与此相反。采用隐式链接方式,程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。 该文件包含了每一个DLL导出函数的符号名和可选的标识号,但是并不含有实际的代码。 LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应
2020-11-12 09:51:19 339
原创 文件加解密(任意文件类型的文件)
直接上代码:支持任意类型的文件的加密和解密可以自由修改密钥文件加解密.#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>#include "des.h"int file_encrypt(const char* file1,const char* file2){ int ret=0; unsigned char buf[4
2020-11-10 17:12:36 1178
原创 读写文件的案例
常用API函数://C 库函数 int fseek(FILE *stream, long int offset, int whence)//设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。///C 库函数 long int ftell(FILE* stream) 返回给定流 stream 的当前文件位置。该函数返回位置标识符的当前值//C 库函数 char *fgets(char *str, int n, FILE *s
2020-11-09 09:09:02 105
原创 文件的读写方式(按字符读写、按行读写、按块读写)
打开文件的方式含义“r” 打开,只读“w” 打开,文件指针指到头,只写“a” 打开,指向文件尾,在已存在文件中追加“rb” 打开一个二进制文件,只读“wb” 打开一个二进制文件,只写“ab” 打开一个二进制文件,进行追加“r+” 以读/写方式打开一个已存在的文件“w+” 以读/写方式建立一个新的文本文件“a+
2020-11-08 10:26:18 1276
原创 结构体套一级指针、二级指针、数组 内存分配和释放问题
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h>#include <string.h>#include <stdio.h>/*"name1111""name2222""name3333"*/typedef struct Teacher{ //char student[10][30] char name[64]; char *alisname; char * *stuname; in
2020-11-02 20:41:19 270
原创 数组的一些回顾
1.数组名的特殊性先说结论数组名代表数组首元素地址,也是一个指针,只读的常量,是一个常量指针,不能修改。#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <string.h>#include <stdio.h>//c语言中没有字符串类型,通过字符数组来模拟字符串//C 库函数 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包
2020-10-31 22:05:51 152
原创 c语言 字符串模型的作业题
涉及到的函数//C 库函数 char *strncpy(char *dest, const char *src, size_t n)//把 src 所指向的字符串复制到 dest,最多复制 n 个字符。//当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充2.//C 库函数 int isspace(int c) 检查所传的字符是否是空白字符。//如果 c 是一个空白字符,则该函数返回非零值(true),否则返回 0(false)。3.//C 库函数 char *strstr(
2020-10-29 15:39:03 196
原创 c语言 内存四区基本模型 堆栈区
数据类型总结数据类型可理解为创建变量的模具(模子);是固定内存大小的别名。数据类型的作用:编译器预算对象(变量)分配的内存空间大小数据类型大小计算(sizeof)可以给已存在的数据类型起别名typedef内存四区模型...
2020-09-26 14:23:25 387
基于ffmpeg和SDL的音视频播放器
2021-05-30
liunx多线程_生产者与消费者模型_链式队列实现.zip|多线程_生产者与消费者模型_链式队列实现.zip
2020-12-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人