数据结构与算法
数据结构与算法
周健文
这个作者很懒,什么都没留下…
展开
-
位图如何实现大数据排序与查找
我们有 1 千万个整数,整数的范围在 1 到 1 亿之间。如何快速查找某个整数是否在这 1 千万个整数中呢?当然,这个问题还是可以用散列表来解决。不过,我们可以使用一种比较“特殊”的散列表,那就是位图。我们申请一个大小为 1 亿、数据类型为布尔类型(true 或者 false)的数组。我们将这 1 千万个整数作为数组下标,将对应的数组值设置成 true。比如,整数 5 对应下标为 5 的数组值设置为 true,也就是 array[5]=true。当我们查询某个整数 K 是否在这 1 千万个整数中的时候,原创 2020-08-08 19:04:22 · 308 阅读 · 0 评论 -
用异或找出数组只出现一次的数字
这是力扣网站的一道题,挺巧妙的,分享给大家。给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。输入: [2,2,1]输出: 1输入: [4,1,2,1,2]输出: 4使用异或实现找数组里面只出现一次的数字。int singleNumber(vector<int>& nums) { int single = 0; for (int num : nums) { single ^= num;原创 2020-08-04 11:59:11 · 348 阅读 · 0 评论 -
基于欧几里德距离的推荐功能实现思路(向量空间)
今天下午我和内助看了YouTube电影速看,一部2小时的电影用9分钟就能看完,影片播放完毕自动推荐特征相信的速看电影,真的很合我们的口味,如此智能的一个功能,究竟是如何实现的呢?接下来,我就简单介绍两种思路的实现方法。基于相似用户做推荐 我用“1”表示“喜爱”,用“0”笼统地表示“不发表意见”。从图中我们可以看出,你跟小明共同喜爱的电影最多,有 5 部。 我们只需要遍历所有的用户,对比每个用户跟你共同喜爱的电影个数,并且设置一个阈值,如果你和某个用户共同喜爱的电影个数超过这个阈值,我们原创 2020-07-17 19:49:51 · 508 阅读 · 0 评论 -
多线程实现生产者和消费者(同步队列)以及线程异步操作async
传统的生产者消费者模型生产者-消费者模式是一个十分经典的多线程并发协作的模式,弄懂生产者-消费者问题能够让我们对并发编程的理解加深。所谓生产者-消费者问题,实际上主要是包含了两类线程,一种是生产者线程用于生产数据,另一种是消费者线程用于消费数据,为了解耦生产者和消费者的关系,通常会采用共享的数据区域,就像是一个仓库,生产者生产数据之后直接放置在共享数据区中,并不需要关心消费者的行为;而消费者只需要从共享数据区中去获取数据,就不再需要关心生产者的行为。但是,这个共享数据区域中应该具备这样的线程间并发协作的功原创 2020-07-16 17:46:02 · 1389 阅读 · 0 评论 -
优先队列(priority_queue)理解与使用
理解 priority_queue定义:priority_queue<Type, Container, Functional>Type 就是数据类型。(int ,double等)Container 就是容器类型(Container必须是用数组实现的容器,默认vector,但不能用 list)Functional 就是比较的方式(可以自定义,默认从小到大排序)这三个参数,后面两个可以省略,第一个不可以。对于这个模板类priority_queue,它是STL所提供的一个非常有效的容原创 2020-07-16 12:54:31 · 673 阅读 · 0 评论 -
二叉树路径总和
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。说明: 叶子节点是指没有子节点的节点。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1 返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径5->4->原创 2020-06-11 00:11:35 · 212 阅读 · 0 评论 -
深度优先搜索岛屿数量
首先回顾一下图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析方法一:深度优先搜索我们可以将二维网格看成一个无向图,竖直或水平相邻的 1 之间有边相连。为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 1,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 1 都会被重新标记为 0。最终岛屿的数量就是我们进行深度优先搜索的次数。class Solution {private: void dfs(vector<vector<原创 2020-06-10 17:46:03 · 293 阅读 · 0 评论 -
两数之和题解(暴力、哈希表)
解题思路暴力枚举暴力枚举的方法:使用两重循环枚举下标i,j,然后判断是否满足条件,适当的优化减少循环,复杂度O(n ^ 2);代码class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { vector<int> res; for(int i = 0; i < nums.size(); i ++ ) {原创 2020-06-10 11:59:28 · 165 阅读 · 0 评论 -
二叉树操作集锦
二叉树顺序存储结构 链式存储结构按前序顺序构建二叉树的结点按层次顺序构建二叉树的结点层次遍历前序遍历中序遍历后序遍历N叉树的构建和遍历原创 2020-05-13 00:52:03 · 233 阅读 · 0 评论 -
回文链表(1.数组&翻转,2.栈,3.快慢指针+翻转)
请判断一个链表是否为回文链表。示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?1. 数组&翻转struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}};class Solution {原创 2020-05-09 19:41:25 · 164 阅读 · 0 评论 -
跳表的实现与特性
如何提高链表线性查找的效率?提升维度,空间换时间。添加第一级索引,视情况逐级添加。添加多级索引跳表查询的时间复杂度分析n/2、n/4、n/8、第k级索引结点的个数就是n/(2^k)假设索引有h级,最高级的索引有2个结点。n/(2^h)=2,从而求得h=log2(n) - 1原始链表共有n=20个结点,第k级索引编号k=[log2(20)] - 1 = 4-1=3,由于索引下标从0开始,故k = 0,1,2,3第3级的索引结点的个数是20/(2^3) = 2.5 向上取整 = 3第2原创 2020-05-08 18:25:34 · 693 阅读 · 0 评论 -
图解链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。原创 2020-05-06 22:05:15 · 203 阅读 · 0 评论 -
二叉树的层序遍历
1、题目给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]]2、非递归层次遍历结点定义struct TreeNode {...原创 2020-05-05 11:51:57 · 202 阅读 · 0 评论 -
使用非递归构建无限级分类树
现在我们拥有全国的省、市、区、县、镇、街道的行政区域信息表,比如中国>>广东省>>深圳市 >>南山区>>xx街道,请将这些信息构建成一棵树,根节点为全国,叶子节点为街道。...原创 2020-04-28 23:55:55 · 425 阅读 · 0 评论 -
回顾《验证二叉搜索树》 和 《二叉树的最大深度》两道题目
验证二叉搜索树回顾下《验证二叉搜索树》 和 《二叉树的最大深度》 这两道题目每道题目后我们讨论问题,并分享下关于我自己对用栈和递归遍历二叉树的心得, 因为很多二叉树的题目都是可以基于栈来解决的,比如左右视图,序列化,验证二叉树等,所以希望大家对这些基本功给予足够的重视;乍一看,这是一个平凡的问题。 只需要遍历整棵树,检查 node.right.val > node.val 和 nod...原创 2020-04-23 22:14:08 · 133 阅读 · 0 评论 -
算法面试:10亿个数中取TOP-1000个数
#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2020/4/4 22:39# @Author : zhoujianwen# @Email : zhou_jianwen@qq.com# @File : topn.py# @Describe: """ 算法面试:10亿个数中取TOP-1000个数 ...原创 2020-04-04 23:32:02 · 386 阅读 · 0 评论 -
算法时间复杂度分析
算法时间复杂度分析#include <iostream>using namespace std; int main() { int n=8,count=0,i,j; for (i=1; i<=n; i++) //时间复杂度为O(n)的循环语句 count++; cout<&l...原创 2020-03-13 13:01:24 · 274 阅读 · 0 评论