遍历

dict.c设计思想

試著忘記壹切 提交于 2020-01-29 08:24:52
双hash_table设计 typedef struct dict { dictType * type ; void * privdata ; dictht ht [ 2 ] ; long rehashidx ; int iterators ; } dict ; 作者在dict数据类型中引入了两个hash_table,其作用是为了动态变化hash_table的大小。 按照常规操作,如果我们想要将一个hash_table的大小进行动态变化,我们需要进行两个步骤 1:改变数组大小 2:将old_hash_table内全部元素进行rehash,重新链接至new_hash_table上。 如果我们在瞬时间内完成从old_hash_table到new_hash_table的转化的话,意味着我们必须对old_hash_table的元素全部遍历一遍,这种操作显然是很费时间的,容易导致CPU在一段时间内处于一个很繁忙的状态(这里没有引入线程什么的,所以这个操作在dict内存储很多数据时,很可能致使Redis无法及时相应其他请求,而致使服务质量下降)。 因此这里引入了一个 rehash 状态,表示当前字典正在进行 rehash ,即将old_hash_table数据迁移至new_hash_table的状态。通过阅读源代码,我们会发现这样一个函数 static void _dictRehashStep

二维数组右上左下遍历

孤人 提交于 2020-01-29 02:49:53
描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。 输入 输入的第一行上有两个整数,依次为row和col。 余下有row行,每行包含col个整数,构成一个二维整数数组。 (注:输入的row和col保证0 < row < 100, 0 < col < 100) 输出 按遍历顺序输出每个整数。每个整数占一行。 样例输入 3 4 1 2 4 7 3 5 8 10 6 9 11 12 样例输出 1 2 3 4 5 6 7 8 9 10 11 12 # include <stdio.h> int sz [ 120 ] [ 120 ] ; int main ( ) { int r , c , i , j ; scanf ( "%d %d" , & r , & c ) ; for ( i = 0 ; i < r ; i ++ ) { for ( j = 0 ; j < c ; j ++ ) { scanf ( "%d" , & sz [ i ] [ j ] ) ; } } for ( j = 0 ; j < c ; j ++ ) { int x = 0 , y = j ; while ( y >= 0 && x < r ) printf ( "%d\n" , sz [ x ++ ] [ y -- ] ) ; }

C/C++树遍历的应用-树的重建

断了今生、忘了曾经 提交于 2020-01-29 01:35:58
输入: 第1行输入二叉树的结点数 第2行输入前序遍历的结点编号序列,相邻编号用空格分开 第3行输入中序遍历的结点编号序列,相邻编号用空格分开 输出: 在1行中输出后序遍历的结点编号序列,用空格分开 代码 # include <iostream> # include <string> # include <algorithm> # include <vector> using namespace std ; int n , pos ; vector < int > pre , in , post ; void rec ( int l , int r ) { if ( l >= r ) return ; int root = pre [ pos ++ ] ; int m = distance ( in . begin ( ) , find ( in . begin ( ) , in . end ( ) , root ) ) ; rec ( l , m ) ; rec ( m + 1 , r ) ; post . push_back ( root ) ; } void solve ( ) { pos = 0 ; rec ( 0 , pre . size ( ) ) ; for ( int i = 0 ; i < n ; i ++ ) { if ( i ) cout << " " ;

LeetCode 94/144/145: Binary Tree Inorder/Preorder/Postorder Traversal LeetCode

怎甘沉沦 提交于 2020-01-29 01:16:49
LeetCode 94 Inorder 问题描述 思路 中序遍历: 按照 左结点 根节点 右结点的顺序 递归实现 : preorder方法实现按照 左结点 根节点 右结点的顺序加入。以左结点为根的子树和 以右结点为根的子树 遍历也是由inorder方法实现。 非递归实现 :通过一个栈,从根节点开始入栈,如果当前结点不为空或者栈不为空,进入循环,只要一直存在左节点就一直入栈,不存在左节点就出栈访问当前结点,当前结点设置为出栈节点的右节点, 然后继续循环遍历 java实现 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ // //way1递归 // class Solution { // List<Integer> result=new ArrayList<Integer>(); // public List<Integer> inorderTraversal(TreeNode root) { // inorder(root); // return result; // } // private void inorder

150行代码打造.net core生产力工具,你值得拥有

夙愿已清 提交于 2020-01-28 22:31:33
原文: 150行代码打造.net core生产力工具,你值得拥有 你是否在初学 .net core时,被依赖注入所折磨? 你是否在开发过程中,为了注入依赖而不停的在Startup中增加注入代码,而感到麻烦? 你是否考虑过或寻找过能轻松实现自动注入的组件? 如果有,那请欢迎继续往下看。 或许你是被我这标题给吸引过来的,请不要怀疑自己的眼睛,如果你真的遇到过以上的问题,那我相信我的分享能帮助到你。 再次声明,我不是标题党。 闲话少说,此组件已经在我们公司内部使用半年有余,虽然代码不多,但也确确实实为公司同事解决些许麻烦事。为了响应公司开源的号召,所以决定将此组件开源。 在没有此工具之前,相信大多数使用core的程序员都是使用如下方式注入依赖的: services.AddTransient<IStudentRepository, StudentRepository>(); services.AddTransient<IGroupRepository, GroupRepository>(); services.AddTransient<ISchoolRepository, SchoolRepository>(); ..... ..... ..... ..... 此处省略若干行 但在项目的开发过程中,需要依赖注入的类存在频繁变动的情况,而时常会出现写了实体以及对应的接口后

Java遍历Map对象的四种方式

柔情痞子 提交于 2020-01-28 21:24:15
关于java中遍历map具体哪四种方式,请看下文详解吧。 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。 Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); } 方法二 在for-each循环中遍历keys或values。 如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。 Map<Integer, Integer> map = new HashMap<Integer, Integer>(); //遍历map中的键 for (Integer key : map.keySet()) { System.out.println("Key = " + key); } //遍历map中的值 for (Integer value : map.values()) { System.out.println("Value = " + value); }

java学习之stream流与方法引用

做~自己de王妃 提交于 2020-01-28 21:08:57
文章目录 Stream流 引言 流式思想概述 获取流 **根据Collection获取流** **根据Map获取流** **根据数组获取流** 常用方法 **逐一处理:forEach** **过滤:fifilter** **映射:map** **统计个数:count** **取用前几个:limit** **跳过前几个:skip** 方法引用 冗余的lambda场景 问题分析 用方法引用改进代码 方法引用符 通过对象名引用成员方法 通过类名称引用静态方法 通过super引用父类成员方法 通过this引用成员方法 类的构造器引用 数组的构造器引用 Stream流 在Java 8中,得益于Lambda所带 来的函数式编程,引入了一个 全新的Stream概念 ,用于解决已有集合类库既有的弊端。 引言 传统集合的多步遍历代码 几乎所有的集合(如 Collection 接口或 Map 接口等)都支持直接或间接的遍历操作。而当我们需要对集合中的元 素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历。例如: import java.util.ArrayList; import java.util.List; public class Demo01ForEach { public static void main(String[] args) { List<String> list

每日JAVA--day03(2020.01.03)

浪子不回头ぞ 提交于 2020-01-28 11:46:47
每日JAVA–day03 JAVA8 Stream Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。 同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。 聚合操作: 对一个数据集合的数进行处理,如分类,取最值,去重等操作 Stream类似迭代器,进行遍历对数据进行操作,不同的是Stream可以并行化的执行操作( Fork/Join 框架 ),Stream 的另外一大特点是,数据源本身可以是无限的。 Stream三种操作 1,Intermediate(相当于添加遍历时的操作) map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

《码渣的进阶》——数据结构

陌路散爱 提交于 2020-01-28 07:00:59
常见面试题 1。什么是平衡二叉树? 插入数据? 2。解决hash冲突的办法? 3。阻塞队列,生产者消费者模型。 4。B-树,B+树的区别(时间复杂度) 5。二叉树与堆的关系?(时间复杂度) 树 1。二叉树的定义: 每个节点最多只有两颗子树,并且有左右子树之分。 每一层节点达到最大就是满二叉树。 每一层节点序号和满二叉树对应,为完全二叉树(满二叉树从后向前删减可变成完全二叉树) 2。遍历二叉树:(先中后代表root点的顺序,左右子树的先后是确定的) 先序遍历:root-左-右 中序遍历:左-root-右 后序遍历:左-右-root 线索二叉树就是通过遍历二叉树的顺序,在左指针加上前驱,右指针加上后继。 3。深林变二叉树: 所有节点,最左子树不变,其余节点全部断开,依次变为左兄弟节点的右节点。 4。最优二叉树(哈夫曼树): 权值越小的节点离根最远,才可以达到二叉树的总路径长度最小。 5。二叉排序树(二叉查找树): 所有节点,左子树的所有节点的值都小于根节点的值,所有右子树节点的值都大于根节点的值。 所以,中序遍历可以达到有序序列。 查找的时间复杂度:O(log2n) 递归查找算法: 6。平衡二叉树: 树中任何一个节点的左右两颗子树的高度差的绝对值不能大于1。 左右旋使之保持为平衡二叉树: 左边多,并且添加节点在左节点(的任一边):直接右旋 右边多,并且添加节点在右节点(的任一边)

LeetCode 103——二叉树的锯齿形层次遍历

淺唱寂寞╮ 提交于 2020-01-28 04:57:37
1. 题目 2. 解答 定义两个栈 s_l_r、s_r_l 分别负责从左到右和从右到左遍历某一层的节点,用标志变量 flag 来控制具体情况,根节点所在层 flag=1 表示从左到右遍历,每隔一层改变一次遍历方向。 用栈 s_l_r 从左到右遍历当前层节点时,按照先左子节点再右子节点的顺序将这一层节点的子节点依次放入栈 s_r_l 中。 用栈 s_r_l 从右到左遍历当前层节点时,按照先右子节点再左子节点的顺序将这一层节点的子节点依次放入栈 s_l_r 中。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int>> result; vector<int> temp; stack<TreeNode *> s_l_r; stack<TreeNode *> s_r_l; if (root) s_l_r.push