Category: 程序设计
有序数据结构在编程中(尤其是算法竞赛和竞技编程)非常实用。在 Python 中,主要由 Sorted Containers 库提供三种有序数据结构:SortedDict、SortedSet 和 SortedList。 深入理解 Python 有序数据结构:从内置到 SortedContainers Python 有序数据结构完整指南 Python 中的有序列表、字典与集合实战解析 带你玩转 Python SortedContainers 与内置排序结构 Python 开发者必读:SortedContainers 与内置数据结构对比 Python 有序数据结构教程 排序是编程中最常见的操作之一。Python 提供了多种方式来维护有序数据,从内置的列表、集合、堆,到第三方库 sortedcontainers。 本教程将介绍 …
前两天,我想查一下自己在 STEEM 区块链上一些重要记录对应的区块号,比如: 注册了我的账号 #4253590 成为见证人 #20190755 挖到我的第一个区块 #20390040 被孙宇晨大佬代理了 SP #41676911 收到一笔 DAO 收入 #95403889 当时手头只有时间戳,却不知道对应的是哪个区块,于是我想到可以用二分查找(binary search)算法来定位。 其实,这个思路在其它区块链上同样适用,并不依赖于特定的链(如 Steem、以太网/Ethereum、比特币/Bitcoin 等)。虽然具体的实现细节(RPC 方法名、时间戳格式等)会有所不同,但整体逻辑是一致的:通过 RPC API 获取某个区块的时间戳;获取最新区块作为上界;然后在区间内使用二分查找。通过多次查询区块时间戳,就能把给定的时间戳映射到最接近的区块号,算法复杂度约为 O(log N)。 当然,大多数区块链也会提供专门的 API …
Web Sockets简介 WebSocket 实现了客户端和服务器之间基于单个 TCP 连接的实时全双工通信。在这篇文章中,我们将向你展示如何用 Python 搭建一个简单的 WebSocket 服务器,以及如何使用 Python 客户端和流行的命令行工具,比如 websocat 和 wscat 来测试它。 用 Python 搭建 WebSocket 服务器 我们使用 websockets 库,它提供了基于 asyncio 的易用 WebSocket 服务器实现。下面是一个简单的服务器(Python 代码),监听端口 …
我上一次教我媳妇编程,大概是两年多前了。后来因为工作太忙,再加上一些其它原因,就停下来了。其实她对编程也不是很感兴趣,反倒更喜欢用 Excel,因为她工作中经常会用到。 上周刚好有点空闲时间,我又教她写了一个反转链表的题目。这个题我前阵子刚教过我儿子,觉得既适合用来面试,也很适合用作编程启蒙。 不过整个过程下来,她一直显得很迷茫。我也不确定是不是我讲得不好。还记得以前有网友留言调侃:“课讲得很一般,不过媳妇还挺好看的。” 说到底,编程不能只停留在理论层面。如果只是单方面学习、平时又缺乏实践的话,不仅学得不深入,而且很容易就忘了。学编程最好的方法就是敲代码。 我挺喜欢“输出型”的事情,像教娃、教媳妇这种,既能复盘知识,又特别解压。之前有网友留言:“你能教媳妇编程还不被她一顿骂,已经很成功了,这可是站在作死边缘反复横跳啊。” 网友说:“难度太大了 赖总 可以换换思路 教教好玩的 比如说图形化编程 或者ai做游戏 或者ai做视频 音乐啥的 女生喜欢这些 生动形象好玩有趣的 算法感觉也只能教教喜欢动脑子和喜欢挑战的小孩子 或者要打比赛,找工作种种需求的,不然这个玩意没人想碰,太无聊了。” 网友还说:“对夫妻感情那么有信心吗?就不能教点别的吗?” 网友又说:“人家是靠颜值吃饭的,你非得逼着学编程,哈哈哈” 本文一共 534 个汉字, 你数一下对不对. 时隔两年, 重新教媳妇编程, 不过她好像全忘光了. (AMP 移动加速版本) …
什么是竞技编程(Competitive Programming)? 竞技编程的英文是 Competitive Programming,是指在限定时间内通过编写程序解决一系列算法问题的比赛形式。比较知名的赛事有 ACM-ICPC、Codeforces、Google Kick Start 等。这类比赛不仅考验选手的算法功底和编程技巧,还需要良好的思维敏捷性和代码调试能力。 比如我二十多年前在高中参加的 ICPC,就是一种典型的竞技编程。当时我们使用的编程语言还是 Turbo Pascal,比赛时间是三个小时,要解决四道题。那时候只要程序能输出正确的结果就行了,根本不太在意代码的实现方式和写得是否优雅。 我家娃在做 LeetCode 的一道算法题时,由于算法不够高效,有两三个测试用例出现了超时。他索性“投机取巧”地加了一个 if 判断,针对那些特定的输入直接返回正确结果。这样做在 LeetCode 上是可行的——前提是你知道测试数据,并能手动处理特殊情况。 但在实际的比赛中,这种做法往往行不通。一方面你无法提前知道测试输入;另一方面题目设计者也会故意防止这种“硬编码逃课”手法,所以比赛更要求通用、稳健的算法方案。这也是竞技编程和普通刷题平台之间的一个重要区别。 🏆 ACM-ICPC(国际大学生程序设计竞赛) 由 ACM 发起,目前由 ICPC Foundation 主办。 …
argmax:从未来推理现在 整个机器学习(最优化),背后的根本数学原理是下面这个公式: arg_max_{x∈X} F(x) 它的含义是:在所有可能的输入 x ∈ X 中,找出让目标函数 F(x) 最大的那个 x。这个公式返回的是最优解 x,而不是最大值本身。 这个公式代表【从未来推理出现在的最佳选择】,因为所有的x有哪些,实际上是没办法穷尽的,以及F有哪些,是未来才知道的。代表一种完全信息视角。 这个和“传统”的数学递推公式是反过来的,传统的递推公式是,利用过去的推理未来的,例如斐波那契额数列 ,假设的是F(n-1)和F(n-2)我们已经知道,我们就可以推理F(n)(这也是动态规划算法的核心)。这个是【利用过去的信息推理未来的】。 因此,机器学习/最优化,本质是预测未来。实际上,arg_max 公式,如果用编程语言来表达,非常好理解: 这个思维方式代表的是“从未来反推现在”:F(x) 是未来某种评估函数,我们假设它存在,并试图找到现在该做什么(x)才能让它最大。 def arg_max(X, F): best_x = None best_score = float('-inf') …
在 Python 中,match 关键字用于模式匹配,在 Python 3.10 中作为结构模式匹配的一部分引入,类似于其他语言中的 switch 语句,但功能更强大。 什么是 match 关键字? 从 Python 3.10 开始,match 语句引入了结构化模式匹配(Structural Pattern Matching)。它类似于其他语言中的 switch 语句,但功能更加强大和灵活。 使用 match 的基本示例 def handle(value): match value: case …