编程基础
常用的编程基础知识,回溯、分治、动态规划等
楚江客
这个作者很懒,什么都没留下…
展开
-
编程基础内容 - functools.partial
functools.partial 固定函数的一些形参值from functools import partialRECORD_SIZE = 32with open('./data/files.data', 'rb') as f: records = iter(partial(f.read, RECORD_SIZE), b'') for r in records: print(r)b'1 2 3 4 5 6 7 8 9 10 11 12 13 14'b' 15原创 2021-09-14 18:26:45 · 292 阅读 · 0 评论 -
编程基础:functools.partial和字典到变量的映射方法
1. functools.partial 固定函数的一些形参值from functools import partialRECORD_SIZE = 32with open('./data/files.data', 'rb') as f: records = iter(partial(f.read, RECORD_SIZE), b'') for r in records: print(r)b'1 2 3 4 5 6 7 8 9 10 11 12 13 14'b'原创 2021-08-05 10:58:22 · 186 阅读 · 0 评论 -
python工程化代码之argparse
argparse实现代码和环境的有限交互argparse功能是让代码具有更多的功能,而且这些功能可以由argparse传入的参数控制。例如:import argparseparser = argparse.ArgumentParser()parser.add_argument("--name", type=str, default="Zhang San") parser.add_argument("--mode", type=str, default="cn") # en和cn两种args =原创 2021-07-05 10:11:18 · 197 阅读 · 0 评论 -
使用Numpy解决线性代数问题
numpy中的线性代数内容矩阵乘法内积矩阵对应位置相乘矩阵的逆求线性方程组的解求行列式特征向量和特征值矩阵对角化1. 矩阵乘法 np.dot(a,b) 和 np.matmul(a,b)两者只有在a,b能否为标量上有区别,其他都基本相同。np.matmul(a,b)是严格数学意义上的矩阵乘法,输入必须是arrays,标量是不允许的。np.dot(a,b) 是允许a,b是标量的,不妨称之为广义上的矩阵乘法a*b,排除标量的情形,两者运算的前提条件可以简单概括为:a的列数要等于b的行数原创 2020-11-10 15:53:57 · 611 阅读 · 0 评论 -
求最小K个数的快速排序解法
1. 题目分析因为只需要求解最小k个部分,所以不一定需要对左右两半都进行递归。在代码上来说,只有递归部分和快排不一,分组部分不需要更改。2. 左右部分的递归控制左右部分递归控制方法如下:(1)[l,...,r] ==> [l,..,p], [p+1,.., r] (2)关注最小k个部分落在哪里: i. 只落在左半时,p >= k, 只在左半进行递归 ii. 至少有部分在右半时,p < k, 只在右半进行递归3. 代码class Solution {原创 2020-10-31 12:08:11 · 296 阅读 · 0 评论 -
DAG模型下动态规划问题
DAG模型下的动态规划1. 巴比伦塔1巴比伦人有n种长方形方块,每种有无限个,第i种方块的三边边长是xi,yi,zi。对于每一个方块,你可以任意选择一面作为底,这样高就随确定了。举个例子,同一种方块,可能其中一个是竖着放的,一个是侧着放的,一个是横着放的。他们想要用堆方块的方式建尽可能高的塔。问题是,只有一个方块的底的两条边严格小于另一个方块的底的两条边,这个方块才能堆在另一个上面。这意味着,一个方块甚至不能堆在一个底的尺寸与它一样的方块的上面。你的任务是编写一个程序,计算出这个塔可以建出的最高的高原创 2020-09-18 17:07:44 · 197 阅读 · 0 评论 -
cin 使用实现常见的输入
cin 使用实现常见的输入-1- 输入多行字符串,每一行字符串放入 vector data1中遇见空格,会将空格后面的视为新的string输入1 2 3 --> data1 = {“1”,“2”,“3”};string row = "";vector<string> data1;while (cin>>row) { data1.push_back(row);}for (auto&e: data1) { cout << e &原创 2020-09-16 14:27:34 · 490 阅读 · 0 评论 -
必须了解的编程基础 -- 二叉搜索树小节
1. 二叉搜索树特点和基本操作左子树不为空的话,左子树值均小于等于根节点, 右子树不为空的话,右子树的值均大于等于根节点。取等号的情况,只可能出现在根节点的一侧。二叉搜索树的中序遍历:中序遍历是先遍历左子树,再遍历右子树;二叉搜索树的中序遍历结果是从小到大的升序。所以,二叉查找树又叫二叉排序树;二叉搜索的基本操作:节点定义:struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNo原创 2020-09-10 20:07:00 · 115 阅读 · 0 评论 -
MyTinySTL源码阅读笔记:vector部分笔记1
1. 预处理指令#ifdef max#pragma message("#undefing marco max")#undef max#endif // max这段预编译代码的功能是:(#ifdef max) 如果标识符 max 已经用宏定义进行过定义,那么执行下面内容:在编译输出窗口打印文本 “#undefing marco max” (#pragma message("#undefing marco max"))删除事先定义的宏定义 max (#undef max)2. 模板类 v原创 2020-09-08 22:56:38 · 908 阅读 · 0 评论 -
必须了解的编程基础 -- 二分搜索小节
1. 二分搜索1.1 leetcode35 搜索插入位置1给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0按照二分法思路列举示例归纳规律:[1,3,5,6]begin原创 2020-09-08 16:44:42 · 105 阅读 · 0 评论 -
必须要了解的编程基础--哈希与字符串
哈希粗略理解就是实现key到value的映射。显然,这里面有很多种实现方式, 比如哈希函数+链表、hash map等。1. 简单题目1.1 LeetCode 409. 最长回文串1给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 “Aa” 不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。示例 1:输入:"abccccdd"输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是原创 2020-09-06 16:36:20 · 160 阅读 · 0 评论 -
必须了解的编程基础 -- 递归篇小节:递归、回溯、分治算法及其在子集、组合、N皇后、归并排序等方面的应用
递归、回溯和分治小节1尊重经验、独立思考、热爱分享1. 递归有些递归很简单理解,比如说链表的递归。画画图就能理解。1.1 剑指 Offer 22. 链表中倒数第k个节点2关键一条是要保证在每一级调用函数对k的影响都是全局性的。实现方式是,在返回的时候返回要访问的节点。递归函数的功能:将head指向倒数第k个节点;递归出口:head为空/** * Definition for singly-linked list. * struct ListNode { * int val;原创 2020-08-29 17:06:27 · 309 阅读 · 0 评论 -
必须了解的编程基础--动态规划篇小节:从简单、中等到困难题
写在前面动态规划题目,状态定义很关键,超级关键。状态如何定义:靠积累、靠结合题目要求思考、靠举例归纳。1. 简单题目1.1 [LeetCode 70 爬楼梯]1通过这个简单题来理解动态规划和回溯法和区别与联系。同时说明动态规划的原理。简单题目简单在于状态转移方程特别直观好想。1.1.1 回溯解法:暴力搜索首先,这种解法是超时的,之所以还这么做的原因是为了在面试的时候保底。多练习递归或者暴力搜索法,以防在面试的时候,啥都不会。爬楼梯抽象出来就是将一个整数不停地减小,每次只有两种选择:策略原创 2020-09-02 23:20:11 · 231 阅读 · 0 评论 -
必须了解的编程基础--归并排序
必须了解的编程基础–归并排序1. 归并排序流程分解:对数列进行简单地二分,分成左右两部分。不像快速排序要求左部要小于右部。对子序列排序:分解到子序列只有1个元素,此时各个子序列便都是有序的。合并:合并两个有序的子序列到临时空间b[]中,最后将临时空间b[]中的数复制到a[]对应的范围内;前面的分解是通过递归实现,而这个合并是在回溯的过程中完成的。2. C++代码实现1#include<bits/stdc++.h>const int MAXN = 1000005;int a[M原创 2020-08-29 13:48:52 · 70 阅读 · 0 评论 -
必须了解的编程基础-- 快速排序及C++模板函数实现
1. 快速排序的流程分组: 将序列分组,并保证该组的左端是小于主元的。自然地,右端要大于等于主元,然后返回主元的位置。递归:递归调用快速排序,不停向左右两端压缩分组,并重复分组操作。2. C++实现快速排序程序注释很清楚,使用模板函数实现。/** * 使用模板函数实现一个快速排序*/#include <bits/stdc++.h>using namespace std;// 分组函数:升序排序保证左端元素小于主元,并返回主元位置template <class T原创 2020-07-09 01:01:58 · 175 阅读 · 0 评论 -
编程数学读书笔记-- 第一章计数的启发
第一章 计数的启发对我们视为理所当然的事情,反思其背后的逻辑,并提炼出相应的方法论。对问题的理解,实现由“形而下”到“形而上”的跨越。1.1 从n进制到按位计数用n进制表示x的操作是:将x表示成对基{..,n−2,n−1,n0,n1,n2,...}\{.., n^{-2},n^{-1}, n^0, n^1, n^2, ...\}{..,n−2,n−1,n0,n1,n2,...}的线性组合。其中,引出一个问题,如何理解 nin^ini常见的理解是 i个n相乘。但是这种理解无法推广到 i≤0i\原创 2020-06-16 00:32:44 · 152 阅读 · 0 评论 -
编程数学读书笔记 -- 第二章逻辑
写在前面:逻辑之于程序员,好比半导体芯片之于现代工业。本节内容是我们都学过的“集合论”和“数字电路”中工具串联:文氏图、真值表、德摩根律和卡诺图。作者给出逻辑要求:不漏不重。(不漏即完整, 不重即排他),逻辑根本上来说就是对“不漏不重”的组合表达。本篇笔记针对如何利用上述逻辑和集合论工具解决复杂逻辑命题。复杂逻辑命题就是一个程序里要写几十个或者上百个if语句组合的情况。1. 复杂命题表示工具: 文氏图和真值表A∩BA \cap BA∩B: A && B, 逻辑与A∪BA\cup原创 2020-06-18 15:58:21 · 1099 阅读 · 0 评论 -
组合数学之隔板法:多元一次方程组解的统计
1. 内容多元一次不定方程:x1+x2+...+xk=nx_1 + x_2 + ... + x_k = nx1+x2+...+xk=n和带约束隔板法求解多元一次方程的正整数解的个数隔板法求解多元一次方程的非负整数解的个数LeetCode题目例子2. x1+x2+...+xk=nx_1 + x_2 + ... + x_k = nx1+x2+...+xk=n的正整数解的个数该方程可以看成是这个问题:将n个球排成一排,使用k-1个隔板将其分成k组, 每组小球的个数是相应的一元变量的解原创 2020-06-06 18:14:39 · 2291 阅读 · 0 评论 -
必须了解的编程基础--动态规划篇小节:简单和中等难度的题目
必须了解编程基础 – 动态规划小节1. 简单题目1.1 [LeetCode 70 爬楼梯]1通过这个简单题来理解动态规划和回溯法和区别与联系。同时说明动态规划的原理。简单题目简单在于状态转移方程特别直观好想。1.1.1 回溯解法:暴力搜索首先,这种解法是超时的,之所以还这么做的原因是为了在面试的时候保底。多练习递归或者暴力搜索法,以防在面试的时候,啥都不会。爬楼梯抽象出来就是将一个整数不停地减小,每次只有两种选择:策略1:减去1;策略2:减2,直到减为0。问一共有多少种不同的策略组合方式原创 2020-09-01 17:50:06 · 205 阅读 · 0 评论 -
必须了解的编程基础--动态规划篇小节
1. 简单题目1.1 [LeetCode 70 爬楼梯]1通过这个简单题来理解动态规划和回溯法和区别与联系。同时说明动态规划的原理。简单题目简单在于状态转移方程特别直观好想。1.1.1 回溯解法:暴力搜索首先,这种解法是超时的,之所以还这么做的原因是为了在面试的时候保底。多练习递归或者暴力搜索法,以防在面试的时候,啥都不会。爬楼梯抽象出来就是将一个整数不停地减小,每次只有两种选择:策略1:减去1;策略2:减2,直到减为0。问一共有多少种不同的策略组合方式。以3和4为例,问题的求解可以变成求原创 2020-08-30 19:07:19 · 114 阅读 · 0 评论 -
必须了解的编程基础:递归回溯小节
递归和回溯小节尊重经验、独立思考、热爱分享1. 递归有些递归很简单理解,比如说链表的递归。画画图就能理解。1.1 剑指 Offer 22. 链表中倒数第k个节点1关键一条是要保证在每一级调用函数对k的影响都是全局性的。实现方式是,在返回的时候返回要访问的节点。递归函数的功能:将head指向倒数第k个节点;递归出口:head为空/** * Definition for singly-linked list. * struct ListNode { * int val; *原创 2020-08-27 20:42:44 · 153 阅读 · 0 评论 -
必须了解的编程基础 -- 回溯法:以0/1背包问题为例
1. 内容回溯法解题步骤;使用回溯法解决0/1背包问题,并在参考文献[1]上进行验证。2. 回溯法解题步骤(1)定义解空间;(2)组织解空间为树或图,使其便于搜索;(3)按照深度优先方法搜索解空间。3. 回溯法解决0/1背包问题3.1 按收益密度降序排序物品3.2 界定函数3.3 递归实现寻找可获得的最大收益参考文献[1] https://www.acwing.com/...原创 2020-05-04 21:50:54 · 985 阅读 · 0 评论 -
必须了解的编程基础:回溯解法 -- 子集生成
1. 内容回溯解法:暴力搜索的一种,可以掉头的递归。从函数调用角度,图形化理解深度优先搜索。原创 2020-05-01 00:14:27 · 260 阅读 · 0 评论 -
必须了解的编程基础:动态规划 -- 从Fibonacci数列到0/1背包问题
1. 内容Fibonacci 数列中的递归问题:递归树;递归出口的设计;存储记忆计算过的递归子问题结果,可以大大降低程序的时间复杂度;对递归树从底往上计算 Fibonacci 数列(所谓的迭代法,其实实质上依旧是递归,只是计算方向改变了而已)。0/1背包问题:动态规划,无后效性的多阶段决策,结果是全局最优;动态规划的实质是“存储记忆 + 递归”;递归法、从底往上的递归解法。2. Fibo...原创 2020-04-27 22:15:12 · 231 阅读 · 0 评论 -
必须了解的编程基础:分治算法
1. 分治算法思想分治算法可行的前提是一个大问题的分解后的小实例是可以求解的。分:把大问题分解为两个或者更少的实例。治:分别解决每个小实例。组合:把所有小实例的解组合成问题的解。2. 实例:幂次方运算#include<iostream>using namespace std;int myPower(int x, int n){ // 治 if(n...原创 2020-03-27 22:23:03 · 190 阅读 · 0 评论