next

链表基础总结

烈酒焚心 提交于 2020-08-17 09:21:24
1. 简单介绍 链表,即 线性表的链式存储结构 ,链表使用一组 任意 的存储单元来存储数据元素。如果某两个数据元素在逻辑位置上相邻,那么他们在物理位置上 不一定 相邻。如图: 但是这样看着太乱了,为了看着舒服,表示方便,我们把这张图改成: 2. 单向链表的结构和特点 在上图中,我们可以看出一个链表包含了 存储的数据元素 (方框中的值)以及这些数据元素之间 逻辑关系 (箭头,下一个数据元素的位置)。为了表示数据元素及逻辑关系,我们需要一个能存储它们的“载体”,这个载体就是 结点 (node)。它长这样: 一个结点有两个部分:data是存储数据的 数据域 ,next是存储它的下一个数据元素(在逻辑上)的位置信息的 指针域 。 有了这两个部分,一个具体的单向链表如下: 介绍到这里,可以很容易地总结出单向链表的特点: 链表由若干结点组成 每个结点由数据域和指针域组成,数据域存储数据,指针域存储下一个结点的位置 单向链表是单向的,数据存取必须从 第一个结点 开始 链表的最后一个结点没有 后继结点 ,所以其指针域置为 Null ,表示链表结束 2.1. 头结点与头指针 头结点 :即单链表的 第1个存数据的结点之前 的那个结点,该结点的数据域可以不存储任何信息,也可以存储如链表长度等附加信息,该结点的指针域指向第1个存数据的结点。 下面是一个带头结点的链表: head.next

Python数据分析师分析自己前程,他仿佛看到了悲惨的未来

微笑、不失礼 提交于 2020-08-17 08:23:33
前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 分析背景 随着近年来人工智能和大数据的火热,越来越多的人想要从事或转行数据分析师,大家对于此行业如此的热爱,主要原因就是薪资客观,有发展前景。 以我浅薄的工作经验,来谈谈对数据分析师的看法,此行业一直存在一个争议,到底是工具重要还是业务水平重要,即工具党和业务党,先站队,我是业务党(以前是工具党)。虽然我大部分时间都在做数据处理工作,这个能力也是必须的,无论是简单的EXCEL,SQL,PPT还是复杂的R,Python,finebi,finereport,HIve都有涉及,但是市面上有太多的分析工具,你不能全部掌握完,而各行业的业务知识是基本相同的。一个业务知识经验的数据分析师看见一堆数据,会清楚地知道从什么角度来分析,数据呈现状况如何,数据是否异常,出现异常原因在那,数据可以解决那些问题,数据适用于那些场景,他会有一个完整的数据分析思路。所以说一个合格的数据分析师是能从一堆数据中找出有价值的信息。 回到正题,数据分析的‘钱’景到底如何呢,本文将从BOOS招聘网站上近期招聘的数据分析师岗位来进行分析,涉及到工作城市,工作经验,薪资水平,技能要求等内容。 数据分析 本次获取的岗位数据量为17485,只保留数据分析岗位的数据量为5616,

关于单向循环链表的约瑟夫问题(Java实现)

假如想象 提交于 2020-08-17 07:02:49
关于单向循环链表的约瑟夫问题(Java实现) 最近在学习链表时,遇到单向循环链表中的约瑟夫问题。在构建循环链表的代码上,我有一点很不理解,遂记录下来。 Josephu 问题为 : 设编号为 1, 2 , .. n 的 n 个人围坐 - - 圈,约定编号为 k (1<=k<=n) 的人从 1 开始报数,数到 m 的那个人出列,它的下一 - 位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。 提示 : 用一个不带头结点的循环链表来处理 Josephu 问题 : 先构成一个有 n 个结点的单循环链表,然后由 k 结点起从 1 开始计数,计到 m 时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从 1 开始计数,直到最后一个结点从链表中删除算法结束。 构建一个单向的环形链表思路:1.先创建第一个节点让first指向该节点,并形成环形 2.后面当我们每创建- -个新的节点,就把该节点,加入到已有的环形链表中即可. 遍历环形链表 1.先让一个辅助指针(变量)curBoy,指向frt节点 2.然后通过一-个while循环遍历该环形链表即可curBoy.next == first结束 代码清单: package com.atguigu.linkedlist; public class Josepfu { public static

2.docker学习笔记之入门,redis主从配置1

允我心安 提交于 2020-08-17 06:55:38
主从复制的作用主要包括: 1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。 2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。 3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点) 分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。 4、读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量; 5、高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。 从节点开启主从复制,有3种方式: (1)配置文件 在从服务器的配置文件中加入:slaveof <masterip> <masterport> (2)启动命令 redis-server启动命令后加入 --slaveof <masterip> <masterport> (3)客户端命令 Redis服务器启动后,直接通过客户端执行命令:slaveof <masterip> <masterport>,则该Redis实例成为从节点。 通过 info replication

tortoisegit 安装配置与使用

自古美人都是妖i 提交于 2020-08-17 06:48:25
由于用惯了svn , 还是比较喜欢用 tortoisegit 的 安装配置 tortoisegit 安装配置 https://www.cnblogs.com/xiuxingzhe/p/9312929.html 使用 参考 https://www.jianshu.com/p/d1c605faac37 https://blog.csdn.net/hjwdz2015/article/details/90487554 总结 1. 安装 git 之后 先不要直接就使用 git , 安装 git 意冷next 即可。 2. 安装git 之后就安装 tortoisegit , 也是一路next . 之后 安装 之后会出现提示配置 用户名和邮箱 。 配置好即可。 3. 使用过程中,就不要使用 在本地创建仓库的功能了。 在 git 上面 新建好仓库之后,然后 clone 到本地电脑。 接着编写代码和提交即可。第一次提交会需要输入git 仓库所属的用户名和密码,输入即可。下次会自动记住的。就不用输入了。 简单使用就是这样了。 来源: oschina 链接: https://my.oschina.net/ouminzy/blog/4299242

软件设计模式学习(二十)迭代器模式

孤街醉人 提交于 2020-08-17 06:28:42
迭代器模式是一种使用频率非常高的设计模式,迭代器用于对一个聚合对象进行遍历。通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,聚合对象只负责存储数据,而遍历数据由迭代器来完成。 模式动机 一个聚合对象,如一个列表(List)或者一个集合(Set),应该提供一种方法来让别人可以访问它的元素,而又不需要暴露它的内部结构。此外,针对不同的需要,可能还要以不同方式遍历整个聚合对象,但是我们不希在聚合对象的抽象层接口中充斥着各种不同遍历的操作。怎样遍历一个聚合对象,又不需要了解聚合对象的内部结构,还能提供多种不同的遍历方式,这就是迭代器模式所要解决的问题。 迭代器模式中,提供一个外部的迭代器来对聚合对象进行访问和遍历,迭代器定义一个访问该聚合元素的接口,并且可以跟踪当前遍历对象,了解哪些元素已经遍历过而哪些没有。 模式定义 提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标(Cursor)。迭代器模式是一种对象行为模式。 模式结构 Iterator(抽象迭代器) 抽象迭代器定义了访问和遍历元素的接口,一般声明以下方法: 用于获取第一个元素的 first() 用于访问下一个元素的 next() 用于判断是否还有下一个元素的 hasNext() 用于获取当前元素的 currentItem() ConcreteIterator(具体迭代器)

HTML5 WebUploader 分片上传

白昼怎懂夜的黑 提交于 2020-08-17 04:12:01
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步: 前端修改 由于项目使用的是BJUI前端框架,并没有使用框架本身的文件上传控件,而使用的基于jQuery的Uploadify文件上传组件,在项目使用的jslib项目中找到了BJUI框架集成jQuery Uploadify的部分,这部分代码封装在bjui-all.js文件中, 在bjui-all.js文件中的全局变量定义中有以下部分代码,这就是定义的有关于上传的Uploadify控件的重要变量: //文件上传对象 function FileUploader(fileLoc, mgr) { var _this = this; this.id = fileLoc.id; this.ui = { msg: null, process: null, percent: null, btn: { del: null, cancel: null,post:null,stop:null }, div: null}; this.isFolder = false; //不是文件夹 this.app = mgr.app; this.Manager = mgr; //上传管理器指针 this.event = mgr.event; this

AQS

瘦欲@ 提交于 2020-08-17 03:47:06
jdk1.8版本 ReentantLock内部使用的是AQS,AQS的基础实现是CAS+Volatile; 调用lock方法,会调用Sync类中的lock()方法 public void lock() { sync .lock(); } Sync中的lock()方法,使用compareAndSetState final void lock() { if (compareAndSetState( 0 , 1 )) setExclusiveOwnerThread(Thread. currentThread ()); else acquire( 1 ); } 调用AbstractQueuedSynchronizer(AQS)中的compareAndSetState, protected final boolean compareAndSetState( int expect, int update) { // See below for intrinsics setup to support this return unsafe .compareAndSwapInt( this , stateOffset , expect, update); } 调用unsafa.compareAndSwapInt进入到static final class NonfairSync extends

Daily English Dictation Number Two

笑着哭i 提交于 2020-08-17 03:46:01
以下内容同时会在微信公众号同步更新: 电子小彭友 (便于手机随时随地翻阅) 抖音/b站:Darren_pty Coach Shane 是美国的一位帮助热爱英语的人更好地掌握英语的老师,他的微博口号是:“Helping students master english !”。 据我所知,老师已经推出四个作品,按照难度级别分别是:E-cubed(Daily Easy English Expression日常英语轻松表达),Daily English Dictation(DD每日听写),DDM(Daily Dictation Members会员每日听写),PIRF(Pronunciation, Intonation, Rhythm and Flow发音、语调、节奏和流畅);其中DDM和PIRF是收费的,有志提高自己相应能力的朋友可以去听老师的课程,在老师的微博就可以找到报名链接(老师人挺不错,算是帮老师宣传一下吧)。在学习他的DD时,发现视频下面字幕不完整且有部分错误,我就尝试在网上找了一下资源,发现只有一个叫“译学馆”的网站上有DD的字幕(只做了五个视频且大量错误,有时间的同学可以去看一看我说的是这样的情况不)。于是我决定做把自己的分享出来,帮助大家在看Coach Shane老师的DD作品时有不懂的,可以来参照,哈哈。 听写原文: Jerry, What time do you have

TCP协议粘包问题详解

让人想犯罪 __ 提交于 2020-08-17 03:29:36
TCP协议粘包问题详解 前言    在本章节中,我们将探讨TCP协议基于流式传输的最大一个问题,即粘包问题。本章主要介绍TCP粘包的原理与其三种解决粘包的方案。并且还会介绍为什么UDP协议不会产生粘包。 基于TCP协议的socket实现远程命令输入    我们准备做一个可以在Client端远程执行Server端 shell 命令并拿到其执行结果的程序,而涉及到网络通信就必然会出现 socket 模块,关于如何抉择传输层协议的选择? 我们选择使用TCP协议,因为它是可靠传输协议且数据量支持比UDP协议要大 。好了废话不多说直接上代码了。    Server端代码如下: # !/usr/bin/env python3 # -*- coding:utf-8 -*- # ==== 基于TCP协议的socket实现远程命令输入之Server ==== import subprocess from socket import * server = socket(AF_INET, SOCK_STREAM) server.bind(( " 0.0.0.0 " ,6666)) # 放在远程填入0.0.0.0,放在本地填入127.0.0.1 server.listen(5 ) while 1: # 链接循环 conn,client_addr = server.accept() while 1: #