DVWA系列1:搭建 DVWA 环境

DVWA系列1:搭建 DVWA 环境

DVWA 是一个合法的漏洞测试、学习环境,先引用一段官方的介绍:

Damn Vulnerable Web Application (DVWA) is a PHP/MySQL web application that is damn vulnerable. Its main goal is to be an aid for security professionals to test their skills and tools in a legal environment, help web developers better understand the processes of securing web applications and to aid both students & teachers to learn about web application security in a controlled class room environment.

一直从事 Web 端的应用开发,对于一些漏洞有所耳闻。终究是纸上得来终觉浅,缺乏实际操作总感觉理解不深刻,因此想利用 DVWA 好好学习实践一下,也记录下自己的理解和学习过程。本次就先从安装环境开始吧XD。

DVWA 运行在 LAMP 环境,也就是需要安装下 Linux,Apache,MySQL,PHP。这里需要注意的是,此时的安装不是我们搞开发时环境的安装,不是版本比较新的就是好的。即使版本老一些,能用就可以了。毕竟我们的目的是使用 DVWA 来学习,不是开发 DVWA ?。之前一直想配置 MySQL 5.7 和 PHP7,结果踩了不少坑也没有配好。因此本文环境的搭建主要目标是快速和方便,尽量采用 yum 安装的方式

各个组件的版本号为 CentOS 7.9,Apahce 2.4.6,MySQL 5.5.62,PHP 5.4。

Damn Vulnerable Web Application is damn vulnerable! Do not upload it to your hosting provider's public html folder or any Internet facing servers, as they will be compromised. It is recommended using a virtual machine (such as VirtualBox or VMware), which is set to NAT networking mode.

!!!应尽量在虚拟机中进行,不要放在 公网服务器上 或 对外暴露,以免造成不必要的风险。!!!

0. 前置准备

虚拟机安装 CentOS 和 更换软件源有较多文章,就不在此展开了。

新装的 CentOS 7.9 中,防火墙 和 SELinux 默认是开启的,这个会造成后续操作的不便,如 阻止从外部连接 Apache 和 MySQL,阻止 PHP 连接数据库,因此需要先关闭这两个:

// 关闭防火墙
> systemctl stop firewalld.service
// 禁用防火墙自启动
> systemctl disable firewalld.service

// 临时关闭 SELinux
> setenforce 0
// 永久关闭
> vi /etc/selinux/config
SELINUX=enforcing 改为 SELINUX=disabled

1. 安装 Apache

这个比较简单,直接使用如下命令即可:

// 安装
> yum install -y httpd

// 启动
> systemctl start httpd

2. 安装 MySQL 5.5

A. 安装下载工具 wget

> yum install -y wget

B. 删除原有的 MariaDB 相关内容

> yum -y remove maria*

C. 开始安装

先找到安装包的链接,打开 MySQL 的网站。由于我们下载的是早已过时的版本,因此点击右下角的 Download Archives,点击 MySQL Community Server

选择版本和操作系统后会自动筛选,我们下载 MySQL ServerClient Utilities 即可,命令为:

// 下载
> wget http://downloads.mysql.com/archives/get/p/23/file/MySQL-server-5.5.62-1.el7.x86_64.rpm
> wget http://downloads.mysql.com/archives/get/p/23/file/MySQL-client-5.5.62-1.el7.x86_64.rpm

// 安装
> yum install -y MySQL-server-5.5.62-1.el7.x86_64.rpm
> yum install -y MySQL-client-5.5.62-1.el7.x86_64.rpm

D. 启动与配置

// 启动 MySQL
> systemctl start mysql
// 开机自启动 MySQL
> systemctl enable mysql

之后输入命令 mysql -u root 并回车,进入 mysql shell 设置密码:

# mysql shell 中

// 设置密码为 123456
> set password=password('123456');

// 设置可以从任意 ip 以 root 身份访问(注意密码要与之前的一致)
> grant all privileges on *.* to 'root'@'%' identified by '123456';
// 刷新权限
> flush privileges;

使用 exit 退出 mysql shell,并重启 mysql 服务:

> systemctl restart mysql

此时尝试一下,就可以在外部访问了。

!!!只针对 MySQL 5.5,更高的版本操作步骤不完全相同!!!

One More Thing

如果某一天这个包不想要了,想要卸载。可以先执行命令查找要卸载的包:

> rpm -qa | grep -i mysql

// 命令结果:
// MySQL-server-5.5.62-1.el7.x86_64
// MySQL-client-5.5.62-1.el7.x86_64

此时如果傻傻地输入 yum erase MySQL-server-5.5.62-1.el7.x86_64 可就大错特多了。因为后面是版本号,真正的包名是 MySQL-server,因此要使用命令卸载

> yum erase MySQL-server
> yum erase MySQL-client

3. 安装 PHP 5.4

使用命令安装即可:

> yum install -y php php-pdo php-mysqlnd php-cli php-gd

4. 设置 DVWA 项目

使用自己喜欢的方式,下载 DVWA 项目 并拷贝到 Apache 的目录 /var/www/html 下,类似与拷贝网页到 WEB 服务器。之后拷贝一份配置模板:

// 拷贝配置模板
> cp /var/www/html/config/config.inc.php.dist /var/www/html/config/config.inc.php

使用 vim 修改对应的数据库配置:

此时访问下 DVWA 首页,可以看到网站已经基本可以运行了。

点击左侧的 Setup/Reset DB,进行数据库的初始化操作。发现还有很多标注为红色的警告需要对应处理下:

可以看到问题有:
a. 禁用了 PHP 的 allow_url_include 函数
b. reCAPTCHA key 未配置(谷歌的验证码服务,暂时不配置)
c. 目录 /var/www/html/hackable/uploads 和 /var/www/html/config 没有写入权限,文件 /var/www/html/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt 没有写入权限

A. 再配置 PHP

使用 vim 修改 /etc/php.ini,查找 allow_url_include 并修改为 On

B. 再配置文件系统

// 添加写入权限
> chmod a+w /var/www/html/hackable/uploads
> chmod a+w /var/www/html/config
> chmod a+w /var/www/html/external/phpids/0.6/lib/IDS/tmp/phpids_log.txt

// 配置完成后需要重启 httpd
> systemctl restart httpd

刷新页面,可以看到(除了二维码)配置都已经没有问题了。

点击下方 Create / Reset Database 按钮,可以看到提示成功了。

左侧有很多典型的漏洞项目,可以使用页面上方提示的 用户名:admin,密码 password 愉快de玩耍了XD。如果要调整难度,可以通过左侧的 DVWA Security 操作。

5. 后记

开始的时候安装 PHP 和 Apache 遇到了很多坑,在这里简单描(tu)述(cao)一下吧。一开始是使用 yum 安装的 httpd,之后安装 PHP7 时,也是添加软件源后使用 yum 安装的,但是好像只安装了 Apache httpd 的一个模块。php -v 命令无法运行,而且无法连接数据库。之后查到的都是使用源码编译安装,而且编译时 php 的配置也各不相同,似乎还需要以源码编译的方式安装 Apache httpd。感觉过于复杂,后来看到一篇文章,里面使用 PHP5 也可以运行 DVWA,因此转变思路,使用低版本软件。

参考:

DVWA GitHub
关闭 SELinux
CentOS7防火墙关闭
CentOS7安装mysql5.5
mysql 远程 error 2002,远程服务器的phpmyadmin 2002错误
1 Way To Install DVWA On CentOS 7
DVWA靶场搭建
Centos7源码安装mysql55+apache+php7(php-fpm)
Linux下PHP7安装与Apache配置
linux yum查看已安装包,查看yum已安装的包
Web安全—LAMP搭建PHP网站(持续完善)
yum httpd php7_Centos 7利用yum安装apache+mysql 8+php7 一篇搞定!

本文转载于网络 如有侵权请联系删除

相关文章

  • 函数之递归[通俗易懂]

    大家好,又见面了,我是你们的朋友全栈君。递归前戏在讲今天的内容之前,我们先来讲一个故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呢……这个故事你们不喊停我能讲一天!我们说,生活中的例子也能被写成程序,刚刚这个故事,让你们写,你们怎么写呀?whileTrue: story=" 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? " print(story)复制你肯定是要这么写的,但是,现在我们已经学了函数了,什么东西都要放到函数里去调用、执行。于是你肯定会说,我就这么写:defstory(): s=""" 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) whileTrue: story()复制但是大家来看看,我是怎么写的!defstory(): s="&quo

  • 爬虫入门到放弃03:爬虫如何模拟人的浏览行为

    前言上一篇文章主要讲了如何解析网页,本篇文章主要来写一下如何发起请求。可能看过前两篇文章的人就开始疑惑了,请求?你不是说一行代码就可以搞定了么。的确,一行代码就能搞定。但是请求部分既然扮演着浏览器的角色,我们是不是应该尽量让它变得和浏览器一样。而我在第一篇文章中也讲到,爬虫是模拟人的行为去获取数据。那么我们就需要知道,一个人去访问网站有什么样的行为?爬虫怎么去模拟人的行为?请求头当一个人打开浏览器输入网址敲下回车,会发起一个HTTP请求,即Request,来访问网站服务端,服务端接收请求并返回响应内容,即Response。在发起请求时,Request会有一个请求头,即Headers,来描述请求信息,例如Content-type、User-Agent、cookie等。相对的也会有一个响应头,这里不多关注。User-Agent在爬虫程序的开发中,请求头中必须添加的就是User-Agent。UA记录了浏览器、操作系统、版本等信息,很多网站会通过检测UA来判断是否是爬虫程序发起的请求。Chrome浏览器请求头信息:ChromeRequestHeaders爬虫程序请求头信息:PythonRequ

  • 給盲人一双眼睛:用Jetson NANO做一个盲人导航器

    一个老外开发者做了一个开源项目:Deepway。这个项目是用JetsonNANO开发套件給盲人做一个导航器。他不是通过声音来給盲人指示,而是别出心裁地通过触觉給盲人传递路况信息。 让我们看看他是怎么做的。准备的材料: NvidiaJetsonNano。Arduino纳米。2个伺服电机。USB音频适配器(因为jetsonnano没有音频插孔)以太网电缆网络摄像头英伟达JetsonNano电源适配器3D打印机。(不必要)Latop(首选NvidiaGPU)或任何云服务提供商。首先用3D打印机做了一个眼镜架: 眼镜上的电子设备非常简单。它只是与ardunionano连接的两个伺服电机。arduinonano接收来自jetson的信号(使用pyserial库),而ArduinoNano控制伺服电机。戴起来是酱样子的:开发过程:- 收集数据集并生成图像蒙版。小哥制作了公路视频,并将这些视频转换为jpg视频。这样,小哥收集了大约10000张图像的数据集。从左,右和中心视图(因此自动标记了)收集了图像。例如:对于Unet,小哥必须为输入数据创建二进制掩码,他使用LabelBox生成二进制掩码。(这花

  • 这款号称“不可破解”的芯片,在3个月内经受了500位专家考验

    2020年年中,美国国防部高级研究计划局(DARPA)与美国国防部国防数字服务处(DefenseDigitalService),在众包安全平台Synack上联合发起了漏洞赏金计划FindingExploitstoThwartTampering计划。DARPA向参与测试的安全专家提供数万美元,让其测试某些实验性的计算机处理器,其中就包括新型Morpheus芯片。该芯片在3个月内成功抵御了500多位安全专家的测试攻击。Morpheus芯片美国密歇根大学的团队研发了Morpheus芯片,该芯片通过快速随机化代码和数据来阻止攻击,而攻击者必须访问这些元素才能获得对硬件的控制权,以此为处理器提供更好的安全性。该团队的负责人ToddAustin表示,Morpheus芯片已经实现了每50毫秒就完成一次“混排”,这比最强大的自动化攻击工具还要快得多。即使攻击者发现了漏洞,但需要利用该漏洞所需的信息几乎立刻就消失了。“就像每次眨眼都会重新排列的魔方一样”,ToddAustin这样形容Morpheus芯片。面对考验Morpheus此前在实验室环境中被展示过,但FindingExploitstoThwart

  • DOCK-5-对接

    对接直接进行半柔性对接,刚性对接不感兴趣 使用指令:dock6-idock.in 复制创建文件dock.in 参数详解: http://dock.compbio.ucsf.edu/DOCK_6/tutorials/ligand_sampling_dock/ligand_sampling_dock.html 格式为:conformer_search_typeflex write_fragment_librariesno user_specified_anchorno limit_max_anchorsno min_anchor_size40 pruning_use_clusteringyes pruning_max_orients100 pruning_clustering_cutoff100 pruning_conformer_score_cutoff25.0 pruning_conformer_score_scaling_factor1.0 use_clash_overlapno write_growth_treeno use_internal_energyyes internal_

  • Matlab.2

    clear是清空变量区clc是清空命令行矩阵运算按alt键,在所有操作得地方有小方块,上面有提示,此时摁对应得按键.就可以跳转了按T键X.*Y运算结果为两个矩阵的相应元素相乘,得到的结果与X和Y同维,此时X和Y也必须有相同的维数,除非其中一个为1×1矩阵,此时运算法则与X*Y相同。矩阵的乘方运算(1)x^Y表示,如果x为数,而Y为方阵,结果由各特征值和特征向量计算得到。(2)X^y表示,如果X是方阵、y是一个大于1的整数,所得结果由X重复相乘y次得到;如果y不是整数,则将计算各特征值和特征向量的乘方。(3)如果X和Y都是矩阵,或X或Y不是方阵,则会显示错误信息。矩阵的数组乘方X.^Y的计算结果为X中元素对Y中对应元素求幂,形成的矩阵与原矩阵维数相等,这里X和Y必须维数相等,或其中一个为数,此时运算法则等同于X^Y。矩阵的左除运算A\B称作矩阵A左除矩阵B,其计算结果大致与INV(A)B相同,但其算法却是不相同的。如果A是N×N的方阵,而B是N维列向量,或是由若干N维列向量组成的矩阵,则X=A\B是方程AX=B的解,X与B的大小相同,对于X和B的每个列向量,都有AX(n)=B(n),此解

  • Confluence 6 Windows 中以服务方式自动重启的原因

    针对长时间使用的Confluence,我们推荐你配置Confluence自动随操作系统重启而启动。针对一些Windows的服务器,这意味着需要让Confluence以服务的方式运行。有下面2种方式来以服务的方式安装Confluence:使用 Confluenceinstaller 进行安装或者使用下面描述得方式手动进行安装。Problemwith64-bitWindows如果你现在运行的是64位的Windows操作系统,你可能在为Tomcat安装为服务的时候遇到问题,如果你现在也同时使用的是64位的JDK的话。请参考我们 knowledgebasearticle 中的内容来获得更多的信息。以Confluence服务方式启用的原因安装以Windows服务方式启动Confluence主要有下面3个好处:减少因为意外关闭Confluence的可能性(如果你以手动方式启动Confluence,一个控制台窗口是会打开的,这个将会增加意外关闭Confluence的可能性。因为你很有可能不小心关闭了这个窗口)。在服务器重启后能够自动恢复Confluence。通过登录服务器的日志文件,能够增加问题解决

  • 当心 CREATE TABLE AS

    对DBA而言,CREATETABLEAS可谓是家常便饭,顺手拈来。需不知该方式虽然简单,但疏忽也容易导致意想不到的问题。笔者前阵子就碰上 了这样的事情。由于是对原表进行克隆,且数据存储在不同的表空间,因此毫不犹豫地使用了CREATETABLEAS,结果在运行package时,error... --1、非空约束遗失 -->使用createtableas来创建对象 scott@CNMMBO>createtabletb_deptasselect*fromdeptwhere1=0; Tablecreated. scott@CNMMBO>descdept; NameNull?Type ------------------------------------------------------------------------------------------------- DEPTNONOTNULLNUMBER(2) DNAMEVARCHAR2(14) LOCVARCHAR2(13) scott@CNMMBO>desctb_dept; NameNull?Typ

  • 腾讯云服务网格解除关联Prometheusapi接口

    1.接口描述接口请求域名:tcm.tencentcloudapi.com。 解除关联Prometheus 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:UnlinkPrometheus。 Version 是 String 公共参数,本接口取值:2021-04-13。 Region 是 String 公共参数,详见产品支持的地域列表。 MeshID 是 String 网格ID 3.输出参数 参数名称 类型 描述 RequestId String 唯一请求ID,每次请求都会返回。定位问题时需要提供该次请求的RequestId。 4.示例示例1UnlinkPrometheus解除关联Prometheus实例 输入示例

  • 基于.NetCore开发博客项目 StarBlog - (15) 生成随机尺寸图片

    系列文章 基于.NetCore开发博客项目StarBlog-(1)为什么需要自己写一个博客? 基于.NetCore开发博客项目StarBlog-(2)环境准备和创建项目 基于.NetCore开发博客项目StarBlog-(3)模型设计 基于.NetCore开发博客项目StarBlog-(4)markdown博客批量导入 基于.NetCore开发博客项目StarBlog-(5)开始搭建Web项目 基于.NetCore开发博客项目StarBlog-(6)页面开发之博客文章列表 基于.NetCore开发博客项目StarBlog-(7)页面开发之文章详情页面 基于.NetCore开发博客项目StarBlog-(8)分类层级结构展示 基于.NetCore开发博客项目StarBlog-(9)图片批量导入 基于.NetCore开发博客项目StarBlog-(10)图片瀑布流 基于.NetCore开发博客项目StarBlog-(11)实现访问统计 基于.NetCore开发博客项目StarBlog-(12)Razor页面动态编译 基于.NetCore开发博客项目StarBlog-(13)加入友情链接功

  • Linux CPU affinity指定程序运行

    在Linux中,我们知道可以通过nice、renice命令改变进程的执行优先级,优先级高的进程优先执行,从而一定程度上保证重要任务的运行。 除了nice、renice外,可以通过CPUaffinity指定进程在哪些处理器上运行。CPUaffinity表示进程要在某个给定的CPU上尽量长时间地运行而不被迁移到其他处理器的倾向性。 2.6版本的Linux内核,实现了CPUaffinity的接口, 需要说明的说:应用程序显示指定了CPUaffinity的话,表示应用程序只会在指定的处理器上运行,就算其他处理器空闲,也不会切换到别的处理器上运行。 以下两种情况有可能需要使用自定义进程CPUaffinity: 1.保证高优先级任务 如有存在一些优先级高的任务,可以将其他任务都分配到指定的处理器执行,这个高优先级任务设定CPUaffinity到其他处理器,避免非重要任务对高优先级任务的干扰。 一个比较好的case是,在分布式计算系统中,在凌晨常常会进行一些数据/索引merge或者导数据的工作,为了避免对服务进程的影响,可以将这些任务都放到一个处理器上执行 2.测试复杂程序 对于号称scaleo

  • 项目兼容ie8技术要点

    好久没有写博客了,因为最近公司项目要调ie8兼容,一直在忙这事,终于竣工了,跟大家分享下这老掉牙的浏览器是如何搞定的。。。本人新手一枚,欢迎大家指教 项目是使用的jeecg框架,后台使用的java,前端页面使用了bootStrap,jquery,easyui框架,页面是jsp+less+js,还用到了好多html5的新标记以及CSS3的新属性以及媒体查询。由于当时做项目时没有考虑ie8,所以改的过程中遇到了好多好多问题。刚拿到项目时谷歌运行没有问题,ie8一片惨白,不光没有样式,连字都没有。。。没有最惨只有更惨。不说废话了,上干货 1.jquery 项目之前所用的jquery为2.1.4版本,不兼容ie8(jquery2.0+都不兼容ie8),将所有页面jquery均换成1.10.2版本。 2.bootstrap 项目所使用的bootstrap是3.3.4版本的,为了兼容ie8做了如下设置 a.将jsp页面加上了<!DOCTYPEhtml> b.设置元标签 <metahttp-equiv="X-UA-Compatible"content="IE=edge,Chrome

  • 知识图谱学习与实践(6)——从结构化数据进行知识抽取(D2RQ介绍)

    1概述 D2RQ,含义是把关系型数据库当作虚拟的RDF图数据库进行访问。D2RQ平台是一个将关系型数据库当作虚拟的、只读的RDF图数据库进行访问的系统。提供了基于RDF访问关系数据库的内容,而无需复制这个数据库将其以RDF的形式进行保存。D2RQ有以下功能: 使用SPARQL查询非RDF数据库; 在Web上,将数据库内容当作链接数据进行访问; 以RDF形式创建一个自定义的数据库,加载成RDF存储; 使用ApacheJenaAPI访问非RDF数据库的信息。 D2RQ是一个开源软件,基于Apache协议发布,源代码在Github上。 D2RQ平台的组成 l D2RQ映射语言,一种声明的映射语言,用于描述本体和关系数据模型之间的关系。 l D2RA引擎,一种服务于Jena语义网工具库插件,使用映射重写对数据库的SQL访问的JenaAPI调用,并且将查询结果传递给框架高层。 l D2R服务器,一个提供调试用的链接数据视图和HTML视图的HTTP服务器,还提供了一个SPARQL协议endpoint数据接口。     2D2RQ映射语言 D2RQ是

  • ChromePHP - Chrome浏览器下的PHP debug工具

    一款 Chrome 下用来配合调试PHP的工具,看官方介绍应该和FirePHP有异曲同工的。喜欢用Chrome 的PHPer可以尝试一下。 官方网站:http://www.chromephp.com/

  • 如何正确查看Linux机器内存使用情况

    如何正确查看Linux机器内存使用情况 背景 只要工作上涉及到Linux机器,基本上都会有这样一个需求,查看内存使用情况,但是怎么看才正确呢?之前使用的是top命令,一直存在一个误区。 为什么top命令看内存会有误区? top是个很好用的系统分析工具,可以实时查看进程,cpu使用率,内存使用率等情况,有点像windows下的任务管理器。我以前一直以为top看到的就是真正的内存使用情况,后来baidugoogle好久,才发现自己图样。==|| 首先看下top命令后展示出来的内存使用情况,我用自己一台搬瓦工vps做示范: Cpu(s):0.0%us,0.3%sy,0.0%ni,99.7%id,0.0%wa,0.0%hi,0.0%si,0.0%st Mem:73728ktotal,70048kused,3680kfree,0kbuffers Swap:16384ktotal,4696kused,11688kfree,64716kcached 复制 可以看到Mem:73728ktotal,70048kused,3680kfree,0kbuffers这一行,就是内存使用情况。一

  • Knockout 官网学习文档目录

    官网:https://knockoutjs.com/documentation/introduction.html Knockout-Validation:https://github.com/Knockout-Contrib/Knockout-Validation 入门 KO如何工作及贡献 下载和安装 监控属性 创建视图模型与监控 使用数组监控 (一)Knockout计算监控属性 1.使用计算监控属性Computed 2.(例子)可写计算监控属性Writablecomputedobservables 3.依赖关系跟踪的工作原理 4.纯计算的监控属性PureComputed 5.ComputedObservable参考 绑定 (二)Knockout文本与外观绑定 1.visible绑定 2.text绑定 3.html绑定 4.css绑定 5.style绑定 6.attr绑定 (三)Knockout控制流程 1.foreach绑定 2.if绑定 3.ifnot绑定 4.with与using绑定 5.component绑定 (四)Knockout表单 1.click绑定 2.event绑

  • golang 二组表转换为树

    packagemain import( "encoding/json" "fmt" ) typeNodestruct{ IDstring`json:"id"` ParentIDstring`json:"parent_id"` Namestring`json:"name"` Children[]*Node`json:"children,omitempty"` } funcConvert(items[]*Node,parentIDstring)[]*Node{ tree:=make([]*Node,0) for_,item:=rangeitems{ ifitem.ParentID==parentID{ item.Children=Convert(items,item.ID) tree=append(tree,item) } } returntree } funcmain(){ items:=[]*Node{ {"1","","1",nil}, {"2","1","1-2",nil}, {"3","1","1-3",nil}, {"4","3","1-3-4",nil}, {"5

  • 数组

    定义 数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。 关键词 线性表:数据线性,每个线性表上的数据最多只有前和后两个方向。 连续的内存空间和相同类型的数据。这个特点使得数组有优点“随机访问”,同时也造成数组删除和插入元素的效率低 优点:数组根据下标随机访问数组元素 计算机会给每个内存单元分配一个地址,计算机通过地址访问内存中的数据。所以当计算机要随机访问内存中某个数组元素时,需要先确定元素存储的内存地址,这里有一个公式 a[i]_address=base_address+i*data_type_size 复制 data_type_size表示数组中每个元素的大小 缺点:插入和删除的效率低 为保证内存数据的连续性,当插入和删除元素时需要大规模的数据搬移, 面试题:数组和链表的区别 链表适合插入和删除,时间复杂度是$O(1)$,数组支持随机访问,根据下标随机访问的时间复杂度是$O(1)$ JVM标记清除算法 在标记阶段,会遍历所有GCROOTS,将所有GCROOTS可达的对象标记为存货,只有当标记工作完成后,清理工作才会开始。问题:标记和清理效率都

  • 【题解】uva1104 chips challenge

    原题传送门 题目分析 给定一张n*n的芯片。 '.'表示该格子可以放一个零件。 'C'表示该格子已经放了一个零件(不能拆下)。 '/'表示该格子不能放零件。 要求在芯片的现有基础上,放置尽可能多的零件,使得: 第i行与第i列零件数相等。 每行每列零件数<=总零件数*A/B。 条件1 考虑如何使得第i行第j列零件数相等。 首先可以想到经典的行列二分图模型,即\((i,j)\)如果可放置零件,则连边;如果必须放置零件,则记录其为必选。最后跑最大流即可。 然而这种模型的局限性就在于无法控制行列相等。 我们考虑用逆向思维解决:\((i,j)\)如果可放置零件,则连边;如果必须放置零件,则不连。而边的意义为点\((i,j)\)不放零件。 这样有什么好处呢? 既然原始边为不放零件,那我们就可以在\((i,i)\)之间连接新边,来收集剩余流量。 如何理解? 设第i行可放置和必须放置零件总和为\(a[i]\),而已经流出\(x\)流量表示不选,第i列同理。则我们可以用新边收集\((i,i)\)之间剩余的流量,而这里的流量就表示选择放置零件。 样例分析(不考虑条件2): n=2

  • centos6 安装mysql5.77(开发版)

    1. 配置yum源: [root@yyf~]#rpm-Uvhhttp://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm [root@yyf~]#yum-config-manager--disablemysql56-community [root@yyf~]#yum-config-manager--enablemysql57-community-dmr [root@yyf~]#yum-yinstallmysql-community-server.x86_64   2.初始化数据库: mysql5.77中是通过mysqld--initialize来初始化数据库,而不是通过mysql_install_db,如: [root@yyf~]#mysqld--initialize--user=mysql--basedir=/var/lib/mysql--datadir=/data1/db3306/    3.登入数据库,5.77中增强了root登入的安全性,在初始化数据库时,就给root生成了一

  • 1436F - Sum Over Subsets 莫比乌斯反演相关

    传送门 解题思路 设\(g(n)\)为集合\(gcd\)恰好为\(n\)时的答案 不太好算 考虑再设一个\(f(n)\)为集合\(gcd\)为\(n\)的倍数的方案数 \(f(n)=\sum\limits_{n|d}g(d)\) 这是显然的莫比乌斯反演形式 那么\(g(n)=\sum\limits_{n|d}\mu(\frac{d}{n})f(d)\) 那么这题答案相当于\(g(1)=\sum\limits_{n|d}\mu(d)f(d)\) 也就是要处理出所有的\(f(i)\) 对于一个\(i\),我们取出所有为\(i\)的倍数的数,那么这些数的贡献就是\(f(i)\) 对于\(\sum_{x\inA}{x}\cdot\sum_{y\inB}{y}\)枚举每对\(xy\)的贡献 设\(|S|\)为当前集合A的大小 当x和y是同一个数的时候,贡献是\(x^2(|S|-1)2^{|S|-2}freq[x]\) 当x和y相等的时候,贡献是\(x^2[(|S|-2)2^{|S|-3}+2^{|S|-2}]freq[x](freq[x]-1)\) 当x不等于y的时候,贡献是\(xy[(|S|-

相关推荐

推荐阅读