Other

双端队列(搬运)

/**************************** 顺序表 实现双端队列 ****************************/ #define DataType int #define maxn 100005 struct Queue { DataType data[maxn<<1]; int head, tail; }; void QueueClear(struct Queue* que) { que->head = maxn; que->tail = que->head - 1; } void QueueEnqueueFront(struct Queue *que, DataType dt) { que->data[ --que->head ] = dt; } void QueueEnqueueRear(struct Queue *que, DataType dt) { que->data[ ++que->tail ] = dt; } void QueueDequeueFront(struct Queue* que) { ++que->head; } void QueueDequeueRear(struct Queue* que) { --que->tail; } DataType QueueGetFront(struct Queue* que) { return que->data[ que->head ]; } DataType QueueGetRear(struct Queue* que) { return que->data[ que->tail ]; } int QueueGetSize(struct Queue* que) { return que->tail - que->head + 1; } int QueueIsEmpty(struct Queue* que) { return !

队列(搬运)

/**************************** 链表 实现队列 ****************************/ typedef int DataType; struct QueueNode; struct QueueNode { DataType data; struct QueueNode *next; }; struct Queue { struct QueueNode *head, *tail; int size; }; void QueueEnqueue(struct Queue *que, DataType dt) { struct QueueNode *insertNode = (struct QueueNode *) malloc( sizeof(struct QueueNode) ); insertNode->data = dt; insertNode->next = NULL; if(que->tail) { que->tail->next = insertNode; que->tail = insertNode; }else { que->head = que->tail = insertNode; } ++que->size; } void QueueDequeue(struct Queue* que) { struct QueueNode *temp = que->head; que->head = temp->next; free(temp); --que->size; if(que->size == 0) { que->tail = NULL; } } DataType QueueGetFront(struct Queue* que) { return que->head->data; } int QueueGetSize(struct Queue* que) { return que->size; } int QueueIsEmpty(struct Queue* que) { return !

《暗时间》--阅读方法

(三)阅读方法 这篇主要写一些学习(尤其是阅读)的基本方法。  1. 趁着对一件事情有热情的时候,一股脑儿把万事开头那个最难的阶段熬过去。万事开头难,因为从不了解到了解基本的一些事实,是一个新知识暴涨的阶段,这个时候的困难是最大的。有人熬不过去,觉得困难太大就放弃了。不过,狂热的兴趣可以抵消对困难的感觉,所以趁着对一件事情有热情的时候,开一个好头是很重要的。(当然,这并不是说持之以恒就不重要了)。当然,也许这个是因人而异的,对我来说我会在对一件事情有浓厚兴趣的时候非常专注地学习,把很多 groundworks 做掉。后面就会顺利一些了。  2. 根据主题来查阅资料,而不是根据资料来查阅主题。以前读书的时候是一本一本的读,眼里看到的是一本一本的书,现在则是一章、甚至一节一节的读,眼中看到的不是一本一本的书,而是一堆一堆的章节,一个一个的知识主题,按照主题来阅读,你会发现读的时候不再是老老实实地一本书看完看另一本,而是非常频繁地从一本书跳到另一本书,从一处资料跳到另一处资料,从而来获得多个不同的人对同一个主题是如何讲解的。比如最近我发现在看蒙特卡罗算法时就查了十来处资料,其中有三四篇 paper 和六七本书;这是因为即便是经典的书,你也不能指望它对其中每一个主题的介绍都是尽善尽美的,有些书对某个主题(知识点)的介绍比较到位,有些书则对另一些知识点介绍得比较到位。而有时候一篇紧凑的 paper 比一本书上讲得还要好。我硬盘里面的书按主题分类,每个主题下面都有一堆书,当我需要学习某个主题的知识时(譬如贝叶斯学习或者神经网络),我会把里面涉及这个主题的书都翻开来,索引到相关章节,然后挑讲得好的看。那么,如何判断一个资料是好资料还是坏资料呢?  3. 好资料,坏资料。好资料的特点:从问题出发;重点介绍方法背后的理念( rationale ),注重直观解释,而不是方法的技术细节;按照方法被发明的时间流程来介绍(先是遇到了什么什么问题,然后怎样分析,推理,最后发现目前所使用的方法)。坏资料的特点是好资料的反面:上来就讲方法细节,仿佛某方法是从天上掉下来的,他们往往这样写“我们定义… 我们称… 我们进行以下几个步骤… ”。根本不讲为什么要用这个方法,人们最初是因为面对什么问题才想到这个方法的,其间又是怎样才想出了这么个方法的,方法背后的直观思想又是什么。实际上一个方法如果将其最终最简洁的形式直接表达出来往往丢失掉了绝大多数信息,这个丢掉的信息就是问题解决背后的思维过程。至于为什么大多数书做不到这一点,我在这里试着分析过。  4. 学习一个东西之前,首先在大脑中积累充分的“疑惑感”。即弄清面临的问题到底是什么,在浏览方法本身之前,最好先使劲问问自己能想到什么方法。一个公认的事实是,你对问题的疑惑越大,在之前做的自己的思考越多,当看到解答之后印象就越深刻。记得大学里面的课本总是瀑布式地把整个知识结构一览无余地放在面前,读的过程倒是挺爽,连连点头,读完了很快又忘掉了,为什么?因为没有带着疑问去学习。  5. 有选择地阅读。很多人觉得我读书速度很快,其实我只是有选择地阅读。这里的选择体现在两个地方,一是选择一本书中感兴趣的章节优先阅读。二是对一本书中技术性较弱或信息密度较低的部分快速地略读。一般来说,除了技术性非常强的书之外,大多数书的信息密度很低,有很多废话。一般来说在阅读的时候应该这样来切分内容:1. 问题是什么?2. 方案是什么?3. 例子是什么?如果是需要解释一个现象的(譬如《黑天鹅》),那么1. 现象是什么?2. 解释是什么?3. 支撑这个解释的理由是什么?4. 例子是什么?一般来说,这一二三四用不了多少字就可以写完了(如果假设只举一到两个精到的例子的话),这样的无废话著作的典型是《合作的进化》;那为什么有些书,明明核心观点就那点东西(顶多加上几个精要的例子罢了)却写得长得要命呢?因为人的思维都有一个“联想”的特点,写着写着就容易旁逸斜出,而且作者自己也往往觉得引申出去挺牛逼,有时候很多与主题无关的废话就掺和进来了;那么,阅读的时候就应该有选择性地滤掉这些不相干的废话;此外还有一种可能性就是大量冗余的例子。一般来说组织得比较好的书会有详细且一目了然的目录和索引,根据目录首先就可以滤掉一部分(比如某个子章节的内容你以前是看过的),然后有时候作者还会举很多冗余的例子,如果你已经觉得印象够深刻了这些例子完全可以不看(一些书就非常厚道地对每个观点只辅以一两个最最经典的例子,譬如《与众不同的心理学——如何正视心理学》,这样的书我最是喜欢)。  6. 为什么看不懂?如果看不懂一个知识,一般有如下几个可能的原因:1. 你看得不够使劲。对此古人总结过——书读百遍其义自现。虽然这个规律不是任何时候都成立的,但是从认知科学的角度看是完全可以解释的,我们在阅读的时候,注意力往往会有选择性地关注其中的某一些“点”,而忽略了另一些“点”,于是一遍看下来可能因为某一些忽略导致无法理解整体。或者干脆看的时候就没注意其中一些细节但重要的东西。此外,大脑理解一个东西需要一定的处理时间,人脑的处理速度很慢,神经冲动每秒传输速度不过百米,所以不能指望看到哪懂到哪。最后,我们可能因为思维定势的原因会从某个特定的角度去看一句话而忽略了从不同角度去理解的可能性。对于这类情况,仔仔细细地再多读两遍,多试着去理解两遍,往往会“哦!原来这样。”地恍然大悟。2. 其中涉及到了你不懂的概念。这是技术性的不理解。这种情况就需要 Cross Reference 。如果一句话中用到了你不懂的概念,那就去查,现在很多书都是电子书,直接搜索一下,或者,对于纸书,看一下书后面的索引就行了。奇怪的是很多人看不懂也不分析一下为什么不懂,就直接放弃了。正如解决问题一样,问题卡住解决不了,第一时间要做的就是分析到底为什么解决不了,而不是直接求救。3. 作者讲述的顺序不对,你接着往下看,也许看到后面就明白了前面的了。

[LeetCode]818. Race Car|BFS & DP附图详解(JavaScript版)

题目描述 LeetCode原题链接:818. Race Car Your car starts at position 0 and speed +1 on an infinite number line. Your car can go into negative positions. Your car drives automatically according to a sequence of instructions 'A' (accelerate) and 'R' (reverse): When you get an instruction 'A', your car does the following: position += speed speed *= 2 When you get an instruction 'R', your car does the following: If your speed is positive then speed = -1 otherwise speed = 1 Your position stays the same.

mysql:lost connection to MYSQL during query

测试的时候,修改本地的数据报了这么一个错误 navcat就这样卡住了。 按照网上的说法设置max_allowed_packet变量 找了半天的my.ini硬是没有,c盘,安装盘都没, 直接在安装目录下重建了个my.ini文件,设置该参数,重启解决

Caddy 反向代理 Portainer

想必看到这篇文章的人不是出现了 Not Found 就是出现了 send http request to https 如果按照官网给的下面这句代码来反向代理端口,完全没办法成功,我没搞懂这个8000端口是干嘛的,但是明显没P用,9443 端口 Portainer 又自己套了 SSL 证书也没办法直接反向代理 docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.11.1 解决办法: 先查找到 Portainer 容器的所在IP docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-ID> 然后直接反向代理 9000 端口 # 这里的<container-ID>是你上一步查询到的容器IP # your.domain { reverse_proxy <container-ID>:9000 } PS. 以后直接映射 9000 端口就行了,我现在懒得改了 docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:2.

Docker-compose 一键搭建 Discourse 论坛

全部替换为你自己的配置即可,不需要SMTP可以删掉 需替换 解释 admin12345 数据库管理员密码 ex_discourse 数据库用户名 user12345 数据库用户密码 example_discourse 数据库名 redis12345 Redis 密码 127.0.0.1:880 映射端口 example.com 网站IP或域名(不加HTTP) siteadmin 网站管理员用户名 siteadmin12345 网站管理员密码 [email protected] 网站管理员邮箱 smtp.mailgun.org 邮箱HOST 587 邮箱端口 邮箱用户名 邮箱用户名 邮箱密码 邮箱密码 tls或ssl 邮箱协议 version: '2' services: postgresql: image: docker.

Win 11 添加并使用 DOH

Windows 默认支持的 DOH 不多,起码没有国内可用的,可以通过命令查看 netsh dns show encryption 使用管理员启动 cmd 添加自定义的 DOH netsh dns add encryption 119.29.29.29 https://doh.pub/dns-query no no netsh dns add encryption 223.5.5.5 https://dns.alidns.com/dns-query no no netsh dns add encryption 223.5.5.5 https://dns.alidns.com/dns-query no no netsh dns add encryption 103.2.57.6 https://public.dns.iij.jp/dns-query no no 再使用命令查看 netsh dns show encryption 接着修改电脑上的 DNS 即可,比如输入119.29.29.29就会显示加密可用

F5查看光模块类型及信息

 list net interface +接口 all-properties,找到包含vendor的字符的文本 其中: vendor:光模块品牌 vendor-partnum:模块型号   

源代码管理工具Github

Github源代码管理工具 一、什么是Github  gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。gitHub于2008年4月10日正式上线,除了git代码仓库托管及基本的 Web管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其注册用户已经超过350万,托管版本数量也是非常之多,其中不乏知名开源项目 Ruby on Rails、jQuery、python 等。2018年6月4日,微软宣布,通过75亿美元的股票交易收购代码托管平台GitHub。  github: 是一个git的服务器提供商帮我们共享代码(托管代码)也是一个开源平台  git : 只是一个源代码管理工具(管理代码的版本)不能实现代码的共享,使用git 来操作github实现代码的共享 二、Github的基本功能 作为一个分布式的版本控制系统,在Git中并不存在主库这样的概念,每一份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。GitHub可以托管各种git库,并提供一个web界面,但它与外国的SourceForge、Google Code或中国的coding的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。  GitHub的客户端主要用来管理自己的代码,更新,提交,查看历史记录,比较文件不同。客户端是版本控制系统,是本地代码和云端代码的桥梁。网页端相当于一个代码托管+社区网站,可以在云端存储从客户端提交上去的代码,同时还存储着所有其他人的私有和工有代码,可以查看公有代码、点赞、收藏、考本等。网页端的issues也非常重要,当发现代码错误或着某些地方出现问题,可以在相应的代码仓库提出问题。 三、Github的使用  首先要去Github官网注册一个账号,详细教程见:https://blog.csdn.net/qq_41782425/article/details/85179912 登录注册好的账号,显示以下页面