遍历

冒泡排序,选择排序

≡放荡痞女 提交于 2020-02-11 12:15:11
什么叫排序 排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序,若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。 排序的本质是什么? 元素的比较+元素的换位 怎么实现 我们拿数组作为一个容器,来存储那些无序的元素。 利用Java语言的循环for,逻辑if,和数组这三个基础知识来进行排序算法的实现。 冒泡排序 思路: 从前往后 两个两个元素进行比较,如果当前元素比之后的那个元素大,需要做两个元素位置的交换。 以从小到大(升序)排序为例,如果想让无序数组中的元素变得有序,冒泡排序先是遍历数组中每一个元素,从第一个元素开始,如果第一个元素比它后一个元素大,这两个元素就交换位置,否则不交换。如此遍历到数组的倒数第二个元素,倒数第二个元素与倒数第一个元素做比较,第一次遍历结束。第一次遍历会得到数组中数字最大的那个元素,第二次遍历会得到次大的元素,以此类推,经过数组的长度-1次的轮询,即可排序完毕。 代码实现 //冒泡排序 public static void bubbleSort ( int [ ] array ) { for ( int i = 0 ; i <

Spark应用程序--词频统计--命令行分析学习

断了今生、忘了曾经 提交于 2020-02-11 09:13:49
词频统计: textFile包含了多行文本内容 : textFile.flatMap(line => line.split(” “)) 会遍历 textFile中的每行文本内容,当遍历到其中一行文本内容时,会把文本内容赋值给变量line,并执行Lamda表达式line => line.split(” “)。 line => line.split(” “) 是一个 Lamda表达式,左边表示输入参数,右边表示函数里面执行的处理逻辑,这里执行line.split(” “),也就是针对line中的一行文本内容,采用空格作为分隔符进行单词切分,从一行文本切分得到很多个单词构成的单词集合。这样,对于textFile中的每行文本,都会使用Lamda表达式得到一个单词集合,最终,多行文本,就得到多个单词集合。 textFile.flatMap() 操作就把这多个单词集合 “拍扁”得到一个大的单词集合。 然后,针对这个大的单词集合,执行 map()操作 : map(word => (word, 1)) 这个 map操作会遍历这个集合中的每个单词,当遍历到其中一个单词时,就把当前这个单词赋值给变量word,并执行Lamda表达式word => (word, 1),这个Lamda表达式的含义是,word作为函数的输入参数,然后,执行函数处理逻辑,这里会执行(word, 1),也就是针对输入的word

js原生的forEach()和map()以及jquery中的each()和map()他们4者的联系和区别

社会主义新天地 提交于 2020-02-11 06:53:14
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> <script> $(function () { var arr=[1,3,5,7,9]; var obj={0:1,1:3,2:5,3:8,4:9,length:5}; // 利用原生的js的forEach()方法遍历 /* 第一个参数:当前遍历到的元素 第二个参数:当前遍历到的索引 原生的forEach一样不能遍历伪数组 */ arr.forEach(function(value,index){ console.log(index,value); }); // arr.forEach(function(value,index){ // console.log(index,value); // }) //

二叉树的前驱和后继(内附视频讲解,各种语言的代码实现)

本小妞迷上赌 提交于 2020-02-11 06:44:52
二叉树的前驱和后继(内附视频讲解,各种语言代码实现) 视频讲解: 这是博主自己的视频,谢谢大家。 b站链接:https://www.bilibili.com/video/av87266752 原理 前驱节点:对一颗二叉树进行中序遍历,按照其遍历后的顺序,当前节点的前一个节点为该节点的前驱节点。 后继节点:对一颗二叉树进行中序遍历,按照其遍历后的顺序,当前节点的后一个节点为该节点的后继节点。 以9为例子: 如果对遍历顺序不太熟悉的兄弟,可以看一下博主的另外一个文章《二叉树的遍历方式(内附视频讲解,各种语言的中序遍历代码实现)》,原文链接: https://blog.csdn.net/weixin_44421437/article/details/104171113 后继节点 首先我们来看一下伪代码: 解释一下TREE-MINIUM(x), 二叉树的性质(左子节点小于右子节点)决定了二叉树的最小值在左子树的最下面的最左边。 也就是这样: 为什么说,当右子节点不为空的时候,它的后继为由子树的最小值? 这是由中序遍历的顺序决定的,左,自己,右,父子节点。 那么好,接下来以元素4为例子进行讲解。 前驱 前驱和后继差不多不重复讲解,贴出伪代码完事。 具体实现 C++语言的前驱和后继代码实现,转载至csdn博主王道鹰击长空的《二叉树的前驱和后继》博文,侵删: 相关链接:https://blog

MongoDB 使用B树

你说的曾经没有我的故事 提交于 2020-02-10 18:13:49
概述 MongoDB 是一个通用的、面向文档的分布式数据库[^1],这是官方对 MongoDB 介绍。区别于传统的关系型数据库 MySQL、Oracle 和 SQL Server,MongoDB 最重要的一个特点就是 『面向文档』 ,由于数据存储方式的不同,对外提供的接口不再是被大家熟知的 SQL,所以被划分成了 NoSQL,NoSQL 是相对 SQL 而言的,很多我们耳熟能详的存储系统都被划分成了 NoSQL,例如:Redis、DynamoDB[^2] 和 Elasticsearch 等。 NoSQL 经常被理解成没有 SQL(Non-SQL)或者非关系型(Non-Relational)[^3],不过也有人将其理解成不只是 SQL(Not Only SQL)[^4],深挖这个词的含义和起源可能没有太多意义,这种二次解读很多时候都是为营销服务的,我们只需要知道 MongoDB 对数据的存储方式与传统的关系型数据库完全不同。 MongoDB 的架构与 MySQL 非常类似,它们底层都使用了可插拔的存储引擎以满足用户的不同需求,用户可以根据数据特征选择不同的存储引擎,最新版本的 MongoDB 使用了 WiredTiger 作为默认的存储引擎[^5]。 作为 MongoDB 默认的存储引擎,WiredTiger 使用 B 树作为索引底层的数据结构,但是除了 B 树之外,它还支持 LSM

【ES6】Generator

蹲街弑〆低调 提交于 2020-02-10 09:53:34
基本概念 是一种异步编程解决方案,语法上可以理解Generator函数是一个状态机,封装了多个内部状态。执行Generator函数会返回一个遍历器对象,可以一次遍历Generator函数内部的每一个状态。 function* helloWorldGenerator() { yield 'hello'; yield 'world'; return 'ending'; } var hw = helloWorldGenerator(); Generator 函数的调用方法与普通函数一样,也是在函数名后面加上一对圆括号。不同的是,调用 Generator 函数后,该函数并不执行,返回的也不是函数运行结果,而是一个指向内部状态的指针对象,也就是上一章介绍的遍历器对象。 下一步,必须调用遍历器对象的 next 方法,使得指针移向下一个状态。也就是说,每次调用 next 方法,内部指针就从函数头部或上一次停下来的地方开始执行,直到遇到下一个 yield 表达式(或 return 语句)为止。换言之,Generator 函数是分段执行的, yield 表达式是暂停执行的标记,而 next 方法可以恢复执行。 yield 表达式 遇到 yield 表达式,就暂停执行后面的操作,并将紧跟在 yield 后面的那个表达式的值,作为返回的对象的 value 属性值。 下一次调用 next 方法时

JS迭代

浪尽此生 提交于 2020-02-10 07:14:19
for each...in 使用一个变量迭代一个对象的所有属性值。对于每一个属性值,有一个指定的语句块被执行。 作为ECMA-357(E4X)标准的一部分,for each...in语句已被废弃,E4X中的大部分特性已被删除,但考虑到向后兼容,for each...in只会被禁用而不会被删除,可以使用ES6中新的for...of语句来代替。 大部分非Mozilla浏览器都没有实现该标准,E4X并不是 ECMAScript 标准的一部分。 语法 for each (variable in object) { statement } 参数 variable 用来遍历属性值的变量,前面的var关键字是可选的。该变量是函数的局部变量而不是语句块的局部变量。 object 该对象的属性值会被遍历。 statement 遍历属性值时执行的语句。 如果想要执行多条语句,请用({ ... }) 将多条语句括住。 警告 永远不要使用for each...in语句遍历数组,仅用来遍历常规对象。 一些对象的内置属性是无法被遍历到的,包括所有的内置方法,例如String对象的indexOf方法。不过,大部分的用户自定义属性都是可遍历的。 for...in for...in语句以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性,语句都会被执行。 语法 for (variable in object) {

设计模式——迭代器模式

ⅰ亾dé卋堺 提交于 2020-02-09 20:42:02
20世纪80年代,那时我家有一台“古老的”电视机,牌子我忘了,只记得是台黑白电视机,没有遥控器,每次开关机或者换台都需要通过电视机上面的那些按钮来完成,我印象最深的是那个用来换台的按钮,需要亲自用手去旋转(还要使点劲才能拧动),每转一下就“啪”的响一声,如果没有收到任何电视频道就会出现一片让人眼花的雪花点。当然,电视机上面那两根可以前后左右移动,并能够变长变短的天线也是当年电视机的标志性部件之一,我记得小时候每次画电视机时一定要画那两根天线,要不总觉得不是电视机,。随着科技的飞速发展,越来越高级的电视机相继出现,那种古老的电视机已经很少能够看到了。与那时的电视机相比,现今的电视机给我们带来的最大便利之一就是增加了电视机遥控器,我们在进行开机、关机、换台、改变音量等操作时都无须直接操作电视机,可以通过遥控器来间接实现。我们可以将电视机看成一个存储电视频道的集合对象,通过遥控器可以对电视机中的电视频道集合进行操作,如返回上一个频道、跳转到下一个频道或者跳转至指定的频道。遥控器为我们操作电视频道带来很大的方便,用户并不需要知道这些频道到底如何存储在电视机中。电视机遥控器和电视机示意图如图1所示: 标题 在软件开发中,也存在大量类似电视机一样的类,它们可以存储多个成员对象(元素),这些类通常称为聚合类(Aggregate Classes),对应的对象称为聚合对象

强连通分量之Kosaraju算法

半世苍凉 提交于 2020-02-09 19:41:08
今天学习了强连通分量的Kosaraju算法,网上写的人也不多,但是跟着视频教程讲解,还有去网上搜了博客,感觉他们的讲解都存在一定的问题,我在学习的时候碰到的一些困惑,他们并没有讲的清楚明白,当然,他们说的大致的思路是正确的。 算法思想: 先说说什么是 强连通分量 强连通分量是针对有向图定义的,为了区别无向图的联通分量的概念。在一个强连通分量中,任意两点都相互可达。 这个图中就存在三个强连通分量,分别{0}、{1}、{2},因为这三个点相互不可达,但是自己到自己还是可到达的。 上图就是一个联通分量,应为在这个图中,两两都可达。 观察上面那个强连通分量图,在有向图中就是个环,很明显可以看到,从0->2有条边,但是2不能直接回到0,若2要能回到0必须得找到另外一条路径,就构成了环(自己理解,并无实际证明) 如何求强连通分量的个数呢? 将所有联通分量看成一个点,得到的图一定是有向无环图,若得到的图存在环 红色的边组成的环构成了一个联通分量。 根据这个图,可以看出,如果从出度为0的点进行 深度优先遍历 ,那么一定会在这个顶点所在的联通分量遍历完以后退出。在遍历该联通分量时,不会去遍历其他的联通分量,因为其出度为0。 遍历完0号联通分量后,再遍历1号联通分量,因为1号联通分量出度为1,但是它是指向0号联通分量的,0号刚刚被遍历完,所以遍历完1号联通分量不会跑到其他联通分量中去。 按照这个思路

练习

无人久伴 提交于 2020-02-09 16:56:21
7-10 树的遍历 给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数 N( ≤),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。 输出格式: 在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。 输入样例: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 输出样例: 4 1 6 3 5 7 2 #include <iostream> #include <vector> using namespace std; vector <int> post,in,level(10000,-1);//申请10000个空间 ,每个值都是-1 //分别设计向量来存储后序遍历,中序遍历,已经层序遍历 int n; void ergodic(int root,int start,int end,int index) { //遍历 //root为根节点,start,end表示子树的范围,index记录树的位置 int i=start; if(start>end) return;//终止循环 while(i<end&&in[i]!=post[root]) i++;//找到根在中序遍历中的位置 level[index]=post[root];