c算法
飞鸟真人
这个作者很懒,什么都没留下…
展开
-
使用2G内存求20亿个数字中出现次数最多的N个
1)分为80块,分块读取1G,排序后保存到文件,其中只保存每个数字的次数;2)对80个文件归并排序,可以写到一个大文件里,每个文件的滑动块大小为25MB;注意,归并的同时,就可以知道当前最大次数的数字,所以可以不写入合并的大文件;1)分块读取和排序:将20亿个数字分成80块,每块1GB大小,这样确保了每个小块可以在内存中进行排序,同时最大限度地减少了内存的使用。2)压缩存储:在每个小块中,只保存每个数字出现的次数,而不是保存所有数字。这样可以大大减少文件的大小,确保每个文件不超过2GB的限制。原创 2024-05-10 21:43:54 · 355 阅读 · 0 评论 -
c++封装libxml2解析网页
有页面不符合XML规范,节点没有闭合,造成XPATH搜不到任何东西,主要是解析树时候名字丢失了,但是通过自己手写深度递归查找还是可以的,原创 2023-03-03 10:14:58 · 227 阅读 · 0 评论 -
telegtram的通信协议MTproto2.0学习2 之 (认证过程与DH密钥交换)
其实就是使用DH算法以及公私钥机制生成会话密钥的过程原创 2022-10-14 16:09:43 · 3676 阅读 · 0 评论 -
关于比赛中c++输入输出的优化
使用fgets优化输入,使用fwrite优化输出原创 2022-08-19 14:48:08 · 641 阅读 · 0 评论 -
switch case 与map哪个效率高?
从直觉来看,应该是map高,因为通过索引来对比应该比反复的判断并jmp来的快,但事实上违反直觉的是,当少量的键值对查找时候,发现switch快了一倍多!!!// justTestit.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include <map>#include <unordered_map>#include <regex>#include "MyTimer.h原创 2022-05-31 16:41:10 · 1846 阅读 · 1 评论 -
数字全排列组合c++实现(非递归)
递归算法自然是容易理解,但是考虑栈也是有容量的,容易爆,并且函数调用也是需要成本的啊!原创 2022-03-19 20:32:47 · 2319 阅读 · 0 评论 -
多线程如何实现高性能计数器(无锁)
多线程协作免不了使用计数器,c++一般会使用锁,或者原子变量操作,std::mutex mutexCounter;int count;void add(){ std::lock_guard<std::mutex> guard(mutexCounter); count ++;}std::atomic<int> count;void add(){ count ++;}在性能要求比较高的情况下,这样的代码100%是会真个业务的瓶原创 2022-03-07 13:47:20 · 910 阅读 · 5 评论 -
考试成绩排序作业
c语言小作业,学生成绩分析原创 2022-02-27 09:19:13 · 178 阅读 · 0 评论 -
茴香豆的茴有多种写法 (之 线程池)
线程池一般用来负责处理异步事件,通常是建立一组线程,当有任务需要执行时,将任务推入线程池进行操作;不同在于1)推入队列的可以是处理函数,也可以是单纯的事件数据;如果是处理函数可以是函数指针或者lamda表达式,在线程激活后直接执行函数体;如果时推入的是数据,则可以根据数据类型加载不同的处理单元执行不同的处理;姑且称之为“操作早绑定”和“操作晚绑定”。2)线程池中共享单个任务队列,也可以每个线程单独拥有一个任务队列,用途不同;这里描述如下:一般来说,任务执行时间长,可以采用这样的模式;原创 2022-01-03 22:05:45 · 237 阅读 · 0 评论 -
c++11与c风格路径拼接速度对比
c++11的std库中没有提供路径拼接的功能,比如我需要将 "d:\\temp\\robin" 和 "..\\config.ini" 路径拼接,这里用c++11的stingstream实现一个:string& replace_str(string& str, const string& to_replaced, const string& newchars){ for (string::size_type pos(0); pos != string...原创 2021-12-03 17:41:18 · 742 阅读 · 0 评论 -
三维向量绕轴旋转的c++实现
罗德里格的公式 :Rodrigues旋转公式_渣渣-CSDN博客_rodrigues使用OSG实现:inline osg::Vec3d rotate(osg::Vec3d & p, osg::Vec3d & r, double a) const{ osg::Vec3d data1 = p * cos(a) + (r ^ p) * sin(a) + r * (p * r) * (1 - cos(a)); return data1;}测试一下:osg::Vec3原创 2021-09-17 17:23:30 · 1294 阅读 · 0 评论 -
使用nodejs中的llhttp库实现http解码
IIHttpurl字段解析:https://github.com/netmindms/urlparserurl中的解码:https://github.com/int2e/UrlEncoder原创 2021-07-26 21:29:10 · 1000 阅读 · 0 评论 -
vector<char>太慢,自己造一个CharVector
如题:#pragma once#include <stdlib.h>#include <stdio.h>#include <malloc.h>#include <string.h>#include <assert.h>#include <iostream>using namespace std;class CharVector{public: CharVector(): base_ptr(nullptr)原创 2021-07-15 15:12:49 · 273 阅读 · 0 评论 -
茴香豆的几种吃法之内存池队列使用方式
对比new delete 与使用容器管理内存队列release_x64模式:new-delete 2000次: 0.2124 msstd::deque 出入队2000次: 0.0699 mslibuv 出入队2000次: 0.053 msstd::mutex mutex1;std::deque<const char *> bufs;void testMem(){ Timer timer; timer.start();...原创 2021-07-09 16:02:48 · 81 阅读 · 0 评论 -
识别代码中的c++格式注释
之前有个人跟我讨论c++如何去掉注释,他强调如果有转义字符怎么处理,我想了半天,觉得只要识别了开始的标记,后面似乎不需要考虑转义字符啊?而且如果只是识别注释,还可以一次读2个字符,这里...原创 2021-06-05 10:24:41 · 190 阅读 · 0 评论 -
最小堆的用法
1. 基本概念:小根堆特性:父节点比2个子节点都小,则说明根节点是最小的1个;但是不保证堆内是有序的;2. 时间点事件队列:尾插法使用:3. 计算最大的N个值:头替换法备注:小根堆求最大的N个数;大根堆求最小的N个数;...原创 2021-05-05 15:11:57 · 541 阅读 · 0 评论 -
GeoHash编解码示例(c++版本)
GeoHash的原理讲的很多了,GeoHash 核心原理解析https://baijiahao.baidu.com/s?id=1684213349530757049&wfr=spider&for=pc大多数实现都是用JAVA写的,今天给个c++版本原创 2021-04-26 08:43:49 · 1038 阅读 · 0 评论 -
比std::qsort还快的快速排序(1千万整数1.7秒)——(快速排序栈溢出与递归优化)
前几天发现老外的开源项目中事件队列中用的就是std::qsort排序,后续插入时候使用了堆方式。快速排序实际应用中是比堆排序要快的,这主要是因为硬件层次会对数据执行高速缓存,数据使用一二三级高速缓存比访问内存块很多,所以堆排序实际上是比较慢的。面试一般是考快速排序,我没有事也默写了一个,并且和std::qsort与std::sort比较了一下,代码的核心就是递归:每个递归:1)拿左边第一个元素作为标杆,小于的放它左侧,大于的放右侧,最后找到标杆合适的位置;2)处理左侧;原创 2021-03-27 20:37:17 · 563 阅读 · 1 评论 -
链表上环路检测中步长的讨论
如果链表上存在环路,则无法找到结尾,需要检测环路,方法1:使用vector记录所有的点,当遇到记录点就是重复了;方法2:龟兔赛跑,a、b二人赛跑,b快a慢,则1)如果有环,2人进入环时,b一定会在某一时间追上a;2)如果没有环,则一定能检测到尾部;典型做法是a每次走1步,b走2步,在某一点时候b能追击到a;设追击时刻,a走的距离为Sa y是入口距离,x入口到追击点的距离;则:1)Sa = y + x; 并且:设此时b已经走了m圈,r为圈长,m>=...原创 2021-03-25 10:06:11 · 177 阅读 · 0 评论 -
C语言替换字符串中的CR 和CR+LF为LF
使用C替换字符串中的\r\n为\n,方法:1)设置2个游标,d为后面被覆盖的位置,S在前为寻找的位置2)找到\r\n时,s移动一位,指向\n3) 找到\r时候,d写入\n; s, d同时后移一位;4)其他的时候,可以认为直接将S写入D,并同时后移一位;5)写入0时候结束;// wholeFile为读取的文本,存储为字符串char *s, *d;for (s = d = wholeFile; d == wholeFile || *(d-1); ) { if原创 2021-02-20 10:13:21 · 992 阅读 · 0 评论 -
c语言向上取整计算方法
用整数N 除以 M,要求向上取整数1) int n = (N + M -1) / M ;简化后就是:2) int n= (N - 1) / M +1;最笨的办法3) int n = N / M + ((N % M != 0) ? 1 : 0 )原创 2021-02-04 11:52:15 · 17848 阅读 · 4 评论