<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Whisper321的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Whisper321</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Whisper321]]></copyright><item><title><![CDATA[Numpy 和 TensorFlow 中 broadcasting 机制的一个有趣例子]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/105757006</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/105757006</guid><author>Whisper321</author><pubDate>Sun, 26 Apr 2020 00:54:02 +0800</pubDate><description><![CDATA[TensorFlow 中 Tensor 间的运算规则

相同 shape Tensor 间的所有算术运算都是 element-wise 的
不同 shape (但 dim 0 相同) Tensor 间的运算称为广播 (broadcasting)， Tensor 与 Scalar 间的运算就是其中一种
在运算时要求各个 Tensor 的数据类型相同

一般的广播是很好理解的，但是有一种特殊情况乍一看...]]></description><category></category></item><item><title><![CDATA[一些常用的 numpy/TensorFlow 函数]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/105547797</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/105547797</guid><author>Whisper321</author><pubDate>Fri, 24 Apr 2020 17:01:36 +0800</pubDate><description><![CDATA[记录一些在计算机视觉框架搭建中有用的函数
1. y, x = np.mgrid[:feature_map_size[0], :feature_map_size[1]]
用于生成 feature map 上 anchor 的中心点阵列
2. x = np.expand_dims(x, axis=-1)
用于为张量添加额外的维度，以便下一步的计算中维度匹配
3. classes = tf.argmax...]]></description><category></category></item><item><title><![CDATA[C++ 中使用指针引用的必要性和例子]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/103425093</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/103425093</guid><author>Whisper321</author><pubDate>Fri, 06 Dec 2019 16:51:00 +0800</pubDate><description><![CDATA[在用C++实现二叉查找树delete操作时出现了奇怪的行为，要被删除掉的节点并没有被删除，而是值变成了0，一番查找确认算法本身没问题，最后发现是向函数传递参数时出现的错误，函数应该接收的是指针引用或者指针的指针，但我的实现接收的是普通指针，先贴正确代码
class TreeNode
{
public:
	TreeNode(int v): val(v), left(NULL), right(NULL...]]></description><category></category></item><item><title><![CDATA[解决 nvprof 报错ERR_NVGPUCTRPERM - The user does not have permission to profile on the target device]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/103050888</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/103050888</guid><author>Whisper321</author><pubDate>Wed, 13 Nov 2019 16:48:04 +0800</pubDate><description><![CDATA[做 CUDA 开发，使用工具 profile 程序性能是必不可少的，其中 nvprof 命令行工具最为常用。我的配置是Ubuntu18.04，CUDA Toolkit 10.1，驱动 440.26。使用命令行 nvprof ./fileName，报错：
Warning: ERR_NVGPUCTRPERM - The user does not have permission to profile ...]]></description><category></category></item><item><title><![CDATA[记录一下这次配置VIM和终端的过程]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/102845396</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/102845396</guid><author>Whisper321</author><pubDate>Thu, 31 Oct 2019 21:26:51 +0800</pubDate><description><![CDATA[为了防止每换一次电脑，配置VIM和终端时需要的资料就要重新寻找的尴尬局面，把这次配置用到的大体上的资料记录一下
配置VIM主要是参考了这个视频：https://www.bilibili.com/video/av55498503，主要是里面介绍的vim-plug：https://github.com/junegunn/vim-plug，安装vim-plug之后，只需要在vimrc中添加插件的网址，保...]]></description><category></category></item><item><title><![CDATA[LeetCode334 increasingTriplet Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/101699693</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/101699693</guid><author>Whisper321</author><pubDate>Sun, 29 Sep 2019 16:41:09 +0800</pubDate><description><![CDATA[题目描述：给定一个未排序的数组，判断这个数组中是否存在长度为 3 的递增子序列。
要求：时间复杂度为O(N)，空间复杂度为O(1)
示例 1：
输入： [1,4,3,5,6]
输出： true
示例 2：
输入： [5,4,3,2,1]
输出： false
这道题目因为严格的时间复杂度和空间复杂度，要使用一种“维护最小有序子序列”方法，记得在别的地方也见过。在这道题中，就是维护一个定长的有序数组，...]]></description><category></category></item><item><title><![CDATA[LeetCode547 findCircleNum Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/100530339</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/100530339</guid><author>Whisper321</author><pubDate>Thu, 19 Sep 2019 15:37:38 +0800</pubDate><description><![CDATA[题目描述：班上有 N 名学生。其中有些人是朋友，有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友，B 是 C 的朋友，那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈，是指所有朋友的集合。给定一个 N * N 的矩阵 M，表示班级中学生之间的朋友关系。如果M[i][j] = 1，表示已知第 i 个和 j 个学生互为朋友关系，否则为不知道。你必须输出所有学生中的已知的朋友圈总数。...]]></description><category></category></item><item><title><![CDATA[LeetCode200 numIslands and LeetCode79 exist Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/99685190</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/99685190</guid><author>Whisper321</author><pubDate>Fri, 16 Aug 2019 21:04:05 +0800</pubDate><description><![CDATA[岛屿数量
题目描述：给定一个由 ‘1’（陆地）和 ‘0’（水）组成的的二维网格，计算岛屿的数量。一个岛被水包围，并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。可以假设网格的四个边均被水包围。
示例：
输入：
11000
11000
00100
00001
输出： 3
岛屿数量是一道深度优先搜索的题目，它与回溯法之间就是差了一个不满足就回头的步骤。初始化一个用来记录访问过位置的矩阵。首先遍历...]]></description><category></category></item><item><title><![CDATA[LeetCode maxCoins Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/98886019</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/98886019</guid><author>Whisper321</author><pubDate>Thu, 08 Aug 2019 21:47:18 +0800</pubDate><description><![CDATA[题目描述： 有n个气球，编号为0到n-1，每个气球上都标有一个数字，存在数组nums里。现在要戳破所有气球，每当戳破一个气球i，你就得到nums[left]*nums[i]*nums[right]个硬币。注意当你戳破第i个气球后，气球left和气球right就变成了相邻的气球。求所能获得的最大硬币数量。
你可以假设nums[-1] = nums[n] = 1，但这是虚拟的，不能戳破。
示例：
输入...]]></description><category></category></item><item><title><![CDATA[LeetCode kthSmallest Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/97972597</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/97972597</guid><author>Whisper321</author><pubDate>Wed, 31 Jul 2019 22:50:10 +0800</pubDate><description><![CDATA[题目描述： 给定一个二叉搜索树，编写一个函数来寻找其中第 k 个最小元素。（假设 k 总是有效的）
二叉搜索树的好性质就是左子树中的元素总小于根节点，右子树中的元素总大于根节点，因此二叉搜索树的中序遍历返回的就是一个排序了的数组，找到第 k 个元素即可，还可以对遍历计数，从而实现早停，进一步优化时间复杂度。我自己写了一个非递归的，另外附上别人实现的递归写法
def kthSmallest(root...]]></description><category></category></item><item><title><![CDATA[LeetCode minSubArrayLen Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/97428809</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/97428809</guid><author>Whisper321</author><pubDate>Fri, 26 Jul 2019 22:41:26 +0800</pubDate><description><![CDATA[题目描述： 给定一个含有 n 个正整数的数组和一个正整数 s ，找出数组中满足其和 ≥ s 的长度最小的连续子数组的长度。如果不存在符合条件的连续子数组，返回 0
示例：
输入： s = 7, nums = [2,3,1,2,4,3]
输出： 2
这道题是一道典型的双指针滑动窗口的题目，记录一下：
def minSubArrayLen(s, nums):
	if not nums:
		retur...]]></description><category></category></item><item><title><![CDATA[LeetCode sortList Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/97307405</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/97307405</guid><author>Whisper321</author><pubDate>Thu, 25 Jul 2019 22:02:58 +0800</pubDate><description><![CDATA[题目描述：在 O(nlogn) 时间复杂度和常数空间复杂度下对链表进行排序。
其实这道题我并没有完成，使用递归方法空间复杂度 O(logn)，但是非递归的归并排序实在是麻烦，就先作罢了。我从题解学到了一个用快慢指针一次遍历找到链表中点的方法，比我以前用的两次法显然好的多，这里记录一下。代码如下：
# Definition for singly-linked list.
# class ListNo...]]></description><category></category></item><item><title><![CDATA[LeetCode insertionSortList Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/96910870</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/96910870</guid><author>Whisper321</author><pubDate>Mon, 22 Jul 2019 23:04:30 +0800</pubDate><description><![CDATA[题目描述：对链表进行插入排序。
本来这道题目是真的打算按一般的插入排序一样每次从后往前移动元素的，但是尝试之后发现并做不到，只好还是按照链表的顺序从前往后寻找插入点，然后一次性插入，也不知道这还叫不叫插入排序…… 这里有个感觉好用的技巧，一般链表操作我们总会给表头一个引用，比如 cur = head，然后对 cur 进行操作，以便最后找到表头。这道题这样是不行的，因为表头元素本身也在移动，所以给链...]]></description><category></category></item><item><title><![CDATA[使用 Python 刷题时可能会用到的技巧]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/96505219</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/96505219</guid><author>Whisper321</author><pubDate>Fri, 19 Jul 2019 22:15:58 +0800</pubDate><description><![CDATA[在使用 Python 刷题的过程中发现了许多以前不知道的操作，用这篇博客记录一下，持续更新。

字典的具体实现就是一个哈希表，所以只要是 hashable 的对象都可以作为 key，比如 tuple，就是说可以直接使用一个元组作为字典的键，但是列表是不可以的。

w = (1,2,3)
i = (2,3,4)
dic = {w:1, i:2}
print(dic[w])
out: 1


sort...]]></description><category></category></item><item><title><![CDATA[LeetCode numTrees Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/96185927</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/96185927</guid><author>Whisper321</author><pubDate>Tue, 16 Jul 2019 21:49:53 +0800</pubDate><description><![CDATA[题目描述：给定一个整数 n，求以 1 … n 为节点组成的二叉搜索树有多少种？
示例：
输入： 3
输出： 5

这道题按我的思路就是暴力递归枚举所有情况，但是官方题解给了一种动态规划的巧妙解法，这里记录一下：
给定一个有序递增序列，为了构建二叉搜索树，可以遍历所有数字 i ，然后 i 左侧的序列作为左子树，右侧的序列作为右子树，然后递归的生成二叉树，也就是递归找到所有情况的方法。为了避免重复，采...]]></description><category></category></item><item><title><![CDATA[LeetCode levelOrder Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/96021562</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/96021562</guid><author>Whisper321</author><pubDate>Mon, 15 Jul 2019 21:23:29 +0800</pubDate><description><![CDATA[题目描述： 给定一颗二叉树，返回其按层次遍历的节点值（即逐层地，从左到右访问所有节点）
示例：
输入：[3,9,20,null,null,15,7]
输出：
[
[3],
[9,20],
[15,7]
]
这道题很容易想到使用 BFS 按层遍历二叉树的所有节点，比较困难的点在于输出的形式：需要将同层的节点组合在一起，所以使用一个临时队列 temp_q 记录下一层的节点，当 queue 中的节点全部...]]></description><category></category></item><item><title><![CDATA[LeetCode groupAnagrams Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/96011587</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/96011587</guid><author>Whisper321</author><pubDate>Mon, 15 Jul 2019 20:10:54 +0800</pubDate><description><![CDATA[题目描述：给定一个字符串数组，将字母异位词组合在一起。字母异位词指字母相同，但排列不同的字符串。
示例：
输入： [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]
输出：
[
[“ate”,“eat”,“tea”],
[“nat”,“tan”],
[“bat”]
]
这道题让我知道了，原来在 Python 中 tuple 是 hashable 的，也就是说可以拿...]]></description><category></category></item><item><title><![CDATA[二叉树的非递归遍历]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/95043937</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/95043937</guid><author>Whisper321</author><pubDate>Mon, 08 Jul 2019 10:38:36 +0800</pubDate><description><![CDATA[二叉树递归遍历的代码实现是非常简单的，所以很多时候考察一个人代码能力的时候会让写一个二叉树的非递归遍历。三种实现如下：
先序遍历
# class TreeNode:
#	def __init__(self, x):
#		self.val = x
#		self.left = None
#		self.right = None 
def preorder(root):
	res = []
	if ...]]></description><category></category></item><item><title><![CDATA[Python 多进程技术详解]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/94865897</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/94865897</guid><author>Whisper321</author><pubDate>Sat, 06 Jul 2019 21:54:22 +0800</pubDate><description><![CDATA[在 Linux/Unix 系统下，可以使用 os.fork() 创建、管理子进程，但是这种方法在 Windows 下是行不通的，而且我并没在实际开发中用过这种方式，所以这里只介绍 Multiprocessing 模块的使用方法。我会直接讲解用法，至于进程、线程的概念这里默认读者是了解的。
一、Python3 多进程编程
1. Process 类
multiprocessing 提供 Process...]]></description><category></category></item><item><title><![CDATA[LeetCode myPow Python3]]></title><link>https://blog.youkuaiyun.com/Whisper321/article/details/94553953</link><guid>https://blog.youkuaiyun.com/Whisper321/article/details/94553953</guid><author>Whisper321</author><pubDate>Wed, 03 Jul 2019 11:15:11 +0800</pubDate><description><![CDATA[题目描述： 实现 pow(x, n) 函数，即实现 x 的 n 次幂函数
示例 1：
输入： 2.00000, 10
输出： 1024.00000
示例 2：
输入： 2.00000, -2
输出： 0.25000
这道题直接暴力累乘会超时，比较多用的是快速幂算法，将所求的幂次折半计算，例如：24=22×22,2^4 = 2^2 \times 2^2, 24=22×22, 25=22×22×22^...]]></description><category></category></item></channel></rss>