单细胞系列教程:质控实战(五)

1. 学习目标

  1. 构建质量控制指标并评估数据质量
  2. 适当的应用过滤器去除低质量的细胞

2. 过滤目标

  1. 过滤数据以仅包含高质量的真实细胞,以便在对细胞进行聚类时更容易识别不同的细胞类型
  2. 对一些不合格样品的数据进行检查,试图查询其不合格的原因

3. 挑战

  1. 从少量复杂的细胞中描绘出质量较差的细胞
  2. 选择合适的过滤阈值,以便在不去除生物学相关细胞类型的情况下保留高质量的细胞

4. 质量标准

当数据加载到 Seurat 并创建初始对象时,会为计数矩阵中的每个单元组装一些基本元数据。要仔细查看此元数据,查看存储在 merge_seurat对象的 meta.data中的数据帧:

# 查看元数据
View(merged_seurat@meta.data)  # 具体介绍见质控准备章节

为了可视化质量控制分析情况,需要计算一些额外的指标。这些包括:

  • number of genes detected per UMI:这个指标让了解数据集的复杂性(每个 UMI 检测到越多基因,数据越复杂)
  • mitochondrial ratio:该指标将提供来自线粒体基因的细胞读数百分比

5. Novelty score

这个值很容易计算,取每个细胞检测到的基因数量的log10 和每个细胞的 UMI数量的log10,然后将 log10的基因数量除以UMIlog10数量。

# 将每个单元格的每个 UMI 的基因数添加到元数据
merged_seurat$log10GenesPerUMI <- log10(merged_seurat$nFeature_RNA) / log10(merged_seurat$nCount_RNA)

6. 线粒体率

Seurat 有一个方便的功能,可以计算映射到线粒体基因的转录本比例。PercentageFeatureSet()函数接受一个模式参数,并在数据集中的所有基因标识符中搜索该模式。由于正在寻找线粒体基因,因此搜以“MT-”模式开头的任何基因标识符。对于每个细胞,该函数获取属于“Mt-”集的所有基因(特征)的计数总和,然后除以所有基因(特征)的计数总和。该值乘以 100 以获得百分比值。

# 计算百分比
merged_seurat$mitoRatio <- PercentageFeatureSet(object = merged_seurat, pattern = "^MT-")  # 该模式 ^MT- 应该根据自己的数据集进行修改
merged_seurat$mitoRatio <- merged_seurat@meta.data$mitoRatio / 100

现在已经具备了评估数据所需的质量指标。但是,希望在元数据中包含一些有用的附加信息,包括单元 ID 和条件信息。首先通过从Seurat对象中提取 meta.data 来创建元数据:

# 创建元数据
metadata <- merged_seurat@meta.data

# 将 Cell ID 添加到元数据
metadata$cells <- rownames(metadata)

# 创建样本列
metadata$sample <- NA
metadata$sample[which(str_detect(metadata$cells, "^ctrl_"))] <- "ctrl"
metadata$sample[which(str_detect(metadata$cells, "^stim_"))] <- "stim"

# 重命名列
metadata <- metadata %>% dplyr::rename(seq_folder = orig.ident,
                                       nUMI = nCount_RNA, 
                                       nGene = nFeature_RNA)
# 最终结果如下图

# 将更新的元数据保存到` Seurat` 对象
merged_seurat@meta.data <- metadata

# 保存为`.RData`
save(merged_seurat, file="data/merged_filtered_seurat.RData")
# 结果如下

7. 质量评估指标

下面将评估以下各种指标,然后决定哪些cells质量低,应从分析中删除

  • Cell counts

细胞计数由检测到的独特细胞条形码的数量决定。对于本实验,预计在 12,000 -13,000 个细胞之间

在理想情况下,会期望唯一细胞条形码的数量与加载的细胞数量相对应。然而,情况并非如此,因为细胞的捕获率只是加载的一部分。例如,与 50-60% 之间的 10X 相比,inDrops 细胞捕获效率更高(70-80%)。

细胞数量也可能因protocol而异,产生的细胞数量远高于加载的数量。例如,在inDrops protocol期间,细胞条形码存在于水凝胶中,这些水凝胶与单个细胞和裂解/反应混合物一起封装在液滴中。虽然每个水凝胶都应该有一个与之相关的细胞条形码,但有时水凝胶可以有多个细胞条形码。同样,使用10X protocol时,有可能仅在乳液液滴 (GEM) 中获得带条形码的珠子,而没有实际的细胞。除了死亡细胞的存在之外,这两者都可能导致比细胞更多的细胞条形码。

# 可视化每个样本的细胞计数
metadata %>% 
  	ggplot(aes(x=sample, fill=sample)) + 
  	geom_bar() +
  	theme_classic() +
  	theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1)) +
  	theme(plot.title = element_text(hjust=0.5, face="bold")) +
  	ggtitle("NCells")

每个样本超过 15,000 个细胞,这比预期的 12-13,000 个要多。很明显,可能存在一些垃圾“细胞”。

  • UMI counts per cell

每个spotUMI 计数通常应高于 500,这是预期的。如果UMI计数在 500-1000 计数之间,是可用的,但可能应该对细胞进行更深入的测序。

# 可视化  UMIs/transcripts per cell 数量
metadata %>% 
  	ggplot(aes(color=sample, x=nUMI, fill= sample)) + 
  	geom_density(alpha = 0.2) + 
  	scale_x_log10() + 
  	theme_classic() +
  	ylab("Cell density") +
  	geom_vline(xintercept = 500)

可以看到,两个样本中的大多数细胞都有 1000 或更高的 UMI

  • Genes detected per cell

对基因检测的期望与对UMI 检测相似,尽管它可能比 UMI低一点。对于高质量数据,比例直方图应包含一个代表被封装细胞的大峰。如果看到主峰左侧有一个小肩,或者细胞的双峰分布,这可能表明有一些问题。可能有一组单元由于某种原因失败了。也可能是存在生物学上不同类型的细胞。

# 通过直方图可视化每个细胞检测到的基因分布
metadata %>% 
  	ggplot(aes(color=sample, x=nGene, fill= sample)) + 
  	geom_density(alpha = 0.2) + 
  	theme_classic() +
  	scale_x_log10() + 
  	geom_vline(xintercept = 300)

  • Complexity (novelty score)

可以使用一种名为novelty score的来评估每个细胞 RNA 种类的复杂程度。novelty score是通过 nGenesnUMI的比率来计算的。如果有很多捕获的转录本(高nUMI)并且在一个细胞中检测到少量基因,这可能意味着只捕获了少量基因,并且只是一遍又一遍地从这些较少数量的基因中测序转录本。这些低复杂性(低novelty score)的细胞可能代表特定的细胞类型(即缺乏典型转录组的红细胞),或者可能是由于人为因素或污染造成的。一般来说,预计优质细胞的novelty score高于 0.80

# 通过可视化每个 UMI 检测到的基因来可视化基因表达的整体复杂性(novelty score分)
metadata %>%
  	ggplot(aes(x=log10GenesPerUMI, color = sample, fill=sample)) +
  	geom_density(alpha = 0.2) +
  	theme_classic() +
  	geom_vline(xintercept = 0.8)

  • Mitochondrial counts ratio

该指标可以确定是否存在大量来自死亡或垂死细胞的线粒体污染。将线粒体计数的劣质样本定义为超过 0.2 线粒体比率标记的细胞。

# 可视化每个细胞检测到的线粒体基因表达分布
metadata %>% 
  	ggplot(aes(color=sample, x=mitoRatio, fill=sample)) + 
  	geom_density(alpha = 0.2) + 
  	scale_x_log10() + 
  	theme_classic() +
  	geom_vline(xintercept = 0.2)

  • Joint filtering effects

孤立地考虑这些QC 指标中的任何一个都可能导致对信号的误解。例如,线粒体计数比例较高的细胞可能参与呼吸过程,并且可能是想要保留的细胞。同样,其他指标可以有其他生物学解释。执行QC时的一般经验法则是将单个指标的阈值设置为尽可能宽松,并始终考虑这些指标的联合影响。通过这种方式,可以降低过滤掉任何活细胞群的风险。

经常一起评估的两个指标是UMI 的数量和每个细胞检测到的基因数量。在这里,绘制了基因数量与线粒体读数分数着色的 UMI数量的关系。联合可视化计数和基因阈值并额外覆盖线粒体分数,得出每个细胞质量的总结图。

# 可视化检测到的基因与 UMI 数量之间的相关性,并确定是否存在大量基因/UMI 数量少的细胞
metadata %>% 
  	ggplot(aes(x=nUMI, y=nGene, color=mitoRatio)) + 
  	geom_point() + 
	scale_colour_gradient(low = "gray90", high = "black") +
  	stat_smooth(method=lm) +
  	scale_x_log10() + 
  	scale_y_log10() + 
  	theme_classic() +
  	geom_vline(xintercept = 500) +
  	geom_hline(yintercept = 250) +
  	facet_wrap(~sample)

好的细胞通常会表现出每个细胞更多的基因和更多的UMI(图的右上象限)。质量差的细胞可能每个细胞的基因和 UMI 较低,并且对应于图左下象限中的数据点。通过该图,评估了线的斜率,以及该图右下象限中数据点的任何散布。这些细胞具有大量的UMI,但只有少数基因。这些可能是垂死的细胞,但也可能代表低复杂性细胞类型(即红细胞)的群体。

线粒体分数仅在很少(颜色较深的数据点)的特别低计数的细胞中较高。这可能表明其细胞质 mRNA 已通过破裂的膜泄漏出来的受损/垂死细胞,因此,只有位于线粒体中的 mRNA 仍然是保守的。可以从图中看到,这些细胞被计数和基因数阈值过滤掉了。

8. 过滤

  • Cell-level 过滤

现在已经可视化了各种指标,可以决定要使用的阈值,这将导致删除低质量的单元格。前面提到的建议通常是一个粗略的指导,具体的实验需要告知选择的确切阈值。下面将使用以下阈值:

  • nUMI > 500
  • nGene > 250
  • log10GenesPerUMI > 0.8
  • mitoRatio < 0.2

为了过滤,将回到 Seurat对象并使用subset()函数:

# 使用选定的阈值过滤掉低质量的细胞
filtered_seurat <- subset(x = merged_seurat, 
                         subset= (nUMI >= 500) & 
                           (nGene >= 250) & 
                           (log10GenesPerUMI > 0.80) & 
                           (mitoRatio < 0.20))
  • Gene-level 过滤

在数据中,将有许多计数为零的基因。这些基因可以显着降低细胞的平均表达,因此将从数据中删除它们。首先确定每个细胞中哪些基因的计数为零:

# 提取计数
counts <- GetAssayData(object = filtered_seurat, slot = "counts")

# 输出一个逻辑矩阵,为每个基因指定每个细胞的计数是否超过零
nonzero <- counts > 0

现在,将按novelty score进行一些过滤。如果一个基因只在少数几个细胞中表达,那么它并不是特别有意义,因为它仍然会降低所有其他不表达它的细胞的平均值。选择只保留在 10 个或更多细胞中表达的基因细胞。通过使用此过滤器,将有效去除所有细胞中计数为零的基因。

# 对所有 TRUE 值求和,如果每个基因超过 10 个 TRUE 值,则返回 TRUE
keep_genes <- Matrix::rowSums(nonzero) >= 10

# 只保留那些在超过 10 个细胞中表达的基因
filtered_counts <- counts[keep_genes, ]

最后,获取这些过滤计数并创建一个新的 Seurat 对象以进行下游分析。

# 重新分配给过滤后的 Seurat 对象
filtered_seurat <- CreateSeuratObject(filtered_counts, meta.data = filtered_seurat@meta.data)

9. 重新评估

执行过滤后,建议回顾指控指标以确保数据符合预期并且有利于下游分析。

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

相关文章

  • VLAN与三层交换机详解

    VLAN概述 VLAN(虚拟局域网)是对连接到的第二层交换机端口的网络用户的逻辑分段,不受网络用户的物理位置限制而根据用户需求进行网络分段。一个VLAN可以在一个交换机或者跨交换机实现。VLAN可以根据网络用户的位置、作用、部门或者根据网络用户所使用的应用程序和协议来进行分组。基于交换机的虚拟局域网能够为局域网解决冲突域、广播域、带宽问题。 VLAN配置实验实验开始之前我们首先往GNS3操作区中拉入一台交换区,三台PC机。接下来就需要我们对交换机进行配置了。 首先我们要给交换机一个储存容量,但一定要记得在开启之前进行配置,不然之后的格式化会花去大量的时间。 因为是对交换机的配置所以我们要配置一个二层单板。 交换机硬件配置完成,我们就可以对PC机的IP地址和VLAN划分进行规划了,规划结果如下图所示。 下面我们还需要对各个设备的借口进行一些配置,首先我们进入交换机的运行模式,之后对我们设置的交换机储存容量进行查看,然后就是关闭交换机的路由功能。 然后就与要我们对vlan进行设置了,这里我们先给vlan10和20一个名字。 设置完每一步要记得查看是否设置成功。 接下来就是对与vlan10和

  • 发布一款层次下拉列表控件

    在项目中经常遇到树状结构的对象比如产品分类、部门结构、地区……对于这类对象的呈现,一般都使用树控件(比如VS2005自带的TreeView控件)。但是树控件的使用和操作都比较复杂,对于一些比较简单的操作,比如单选其中的一个节点的情况则可用使用下拉列表框来代替。要在DropDownList中展示出树结构的层次,那就必须在每个节点的Text前加入一定的占位符,以实现层次的效果,比如:中国--四川----成都----乐山----绵阳--北京--广东----深圳----东莞----珠江由于这种下拉列表控件在项目中经常使用,于是决定写一个通用的服务器控件出来。该控件继承自DropDownList,在使用中只需要为该控件设置用于数据绑定的DataTextField和DataValueField,以及新增的属性ChildProperty(string,对象的Child属性的名字)和DeepChar(string,在表示层次中使用的占位符,默认是“--”),设置了这4个属性后,在后台就只需要将树结构对象的Root节点作为DataSource,然后执行DataBind()即可。控件Code using 

  • TRTC小程序进房失败

    首先要在微信的管理平台开通实时音视频相关的权限。否则会出现jsapihasnopermission的提示vconsole本地报错目前live-pusher和live-player这两个微信原生组件,并没有在微信开发者工具支持,因此在微信开发者工具上是无法运行的,微信的真机调试模块也经常会有问题,因此最好的开发方式还是使用预览使用预览进行开发trtc-wx如何判断进房是否成功呢?监听LOCAL_JOIN的事件,这个对应live-pusher上的bindstatechange这个handler抛出的1018事件

  • H3C技术--VLAN

    VLAN第1章VLAN配置 1-1 第1章VLAN配置 1.1VLAN简介 1.1.1VLAN概述 以太网是一种基于CSMA/CD(CarrierSenseMultipleAccess/CollisionDetect,载 波侦听多路访问/冲突检测)的共享通讯介质的数据网络通讯技术,当主机数目较多 时会导致冲突严重、广播泛滥、性能显著下降甚至使网络不可用等问题。通过交换 机实现LAN互联虽然可以解决冲突(Collision)严重的问题,但仍然不能隔离广播 报文。在这种情况下出现了VLAN(VirtualLocalAreaNetwork)技术,这种技术可 以把一个LAN划分成多个逻辑的LAN——VLAN,每个VLAN是一个广播域,VLAN 内的主机间通信就和在一个LAN内一样,而VLAN间则不能直接互通,这样,广播报 文被限制在一个VLAN内,如图1-1所示。 VLAN2 VLAN5 SwitchASwitchB Router 图1-1VLAN示意图 VLAN的划分不受物理位置的限制:不在同一物理位置范围的主机可以属于同一个 VLAN;一个VLAN包含的用户可以连接在同一个交换机上,也可

  • 死磕 java线程系列之线程池深入解析——定时任务执行流程

    注:java源码分析部分如无特殊说明均基于java8版本。注:本文基于ScheduledThreadPoolExecutor定时线程池类。简介前面我们一起学习了普通任务、未来任务的执行流程,今天我们再来学习一种新的任务——定时任务。定时任务是我们经常会用到的一种任务,它表示在未来某个时刻执行,或者未来按照某种规则重复执行的任务。问题(1)如何保证任务是在未来某个时刻才被执行?(2)如何保证任务按照某种规则重复执行?来个栗子创建一个定时线程池,用它来跑四种不同的定时任务。publicclassThreadPoolTest03{ publicstaticvoidmain(String[]args)throwsExecutionException,InterruptedException{ //创建一个定时线程池 ScheduledThreadPoolExecutorscheduledThreadPoolExecutor=newScheduledThreadPoolExecutor(5); System.out.println("start:"+System.curre

  • Android-Could not download kotlin-reflect.jar

    在AndroidStudio中报以下错误;错误详情:Couldnotdownloadkotlin-reflect.jar(org.jetbrains.kotlin:kotlin-reflect:1.1.3-2):Nocachedversionavailableforofflinemode解决方式:Offinework取消打钩:打开一个,在当前电脑,当前AndroidStudio正常编译运行OK的工程的build.gradle文件:copyclasspath'com.android.tools.build:gradle:3.2.1'修改工程的-build.gradle,为classpath'com.android.tools.build:gradle:3.2.1'成功解决:

  • vCenter Server 6.7下载地址

    序言:最近准备研究一些服务时需要使用多个虚拟机,于是找了一台物理服务器安装EXSI6.7系统,创建虚拟机正常没问题了。但是当我需要多个同样基础环境的虚拟机时发现无法通过导出OVF模版来快速创建虚拟机时,要么下载OVF模版失败,要么只下载了一部分导致无法通过OVF模版创建虚拟机;使用克隆功能也报错,感觉很忧伤。查询了资料发现导出OVF模版确实有问题,只能通过vCenterServer来实现使用模版创建虚拟机了,于是满世界找vCenterServer6.7安装文件,很头疼VMware官方网站注册找资源最后下载的界面告诉你没有权限,百度了好久也没找到镜像,最后终于在一个6.5升级到6.7点教程找到了下载资源,亲测有用。教程地址:https://blog.csdn.net/zylvhh/article/details/81044341网盘下载地址:https://pan.baidu.com/s/14v_mxyNfP0W9KZmlhVjrVg同时附上我百度网盘的分享链接地址:https://pan.baidu.com/s/19skVbuPCdnxEnSsMz2IslQ简直是费了九牛二虎之力才搞到

  • Theia APIs——命令和快捷键

    上一篇:使用Theia——创建语言支持 命令和快捷键   Theia可以通过多种不同的方式进行扩展。命令允许packages提供可以被其它包调用的唯一命令,还可以向这些命令添加快捷键和上下文,使得它们只能在某些特定的条件下被调用(如窗口获取焦点、当前选项等)。 在Theia中添加命令   要将命令添加到Theia,必须实现CommandContribution类,如: java-commands.ts @injectable() exportclassJavaCommandContributionimplementsCommandContribution{ ... registerCommands(commands:CommandRegistry):void{ commands.registerCommand(SHOW_JAVA_REFERENCES,{ execute:(uri:string,position:Position,locations:Location[])=> commands.executeCommand(SHOW_REFERENCES.id,uri,posi

  • zoj3672 Gao The Sequence

    原地踏步了半年,感觉一切都陌生了~ 题意:a[i]-一个任意的数,这个数要等于a[1]~a[i-1]每个数减去任意一个数,经过多次这样的变换到达目标b序列,能到达就yes不能到达距no. 一开始各种分析,所有的差的和必须是偶数,sum(cha[1~i-1])>=cha[i](其中cha[i]=a[i]-b[i])等,后来想从最后一项的cha变0,然后同时消除紧邻着的cha,尽量消除,消除到最后不能消除就NO,华丽丽的WA了~ badcase: 3302010正确的答案是yes,第一项和第三项同时减1,即202000第一项和第二项同时减2,即yes。 正解: ①sum(cha[1~n])为偶数②2*max(cha[1~n])<=sum

  • 论文阅读 WAVEGLOW

    WAVEGLOW 摘要1引言2WAVEGLOW2.1放射耦合层2.21*1可逆卷积2.3早期产出2.4推论 3实验记录 摘要 在本文提出了WaveGlow:一种依靠流的从梅尔频谱图合成高质量语音的网络。它结合了Glow和WaveNet,生成的快、好、高质量的韵律,而且还不需要自动回归。实现也只是一个单网络,仅使用单个成本函数进行训练:最大化训练数据的可能性,这使训练过程简单且稳定。我们的用了PyTorch实现,结果也蛮好的,和最佳公开的WaveNet效果相同。 1引言 随着与机器的语音交互变得越来越有用,有效合成高质量语音变得越来越重要。语音质量或延迟的微小变化会对客户体验和客户偏好产生重大影响。但是,高质量的实时语音合成仍然是一项艰巨的任务。语音合成需要生成具有高长期依赖性的超高维样本。另外,人类对音频样本中的统计缺陷很敏感。除了质量挑战之外,实时语音合成还具有挑战性的速度和计算约束。当音频采样率低于16kHz时,感知的语音质量会大大下降,而更高的采样率会生成更高质量的语音。此外,许多应用要求合成速率比16kHz快得多。例如,在远程服务器上合成语音时,严格的交互性要求意

  • 软件工程第一次团队作业

    1.在文章开头写出会议基本信息。必须包括:团队序号、队伍名称、团队成员清单(标注出队长)、会议召开的时间、地点、参与人、缺席人及缺席原因、会议照片、此博客的撰写人。 团队序号:05 团队名称:超能陆战队 团队成员:刘利(队长)、孙永齐、佘昊伦、林会洋、林小富、刘沣萱,李金龙 会议召开时间:9月18日下午1:00 会议召开地点:图书馆二楼 参会人员:刘利、孙永齐、佘昊伦、林会洋、林小富、刘沣萱,李金龙 缺席人员:无缺席 缺席原因:无 博客撰写人:孙永齐   会议照片:                  团队成员分工 产品经理:孙永齐 UI设计师:刘利 软件测试工程师:刘沣萱 软件开发工程师:佘昊伦、林会洋、林小富,李金龙 2,给出通知团队成员阅读《构建之法(第三版)》第5、6、8、9章,思考相应问题及团队成员回复的截图。            

  • 三位一体的漏洞分析方法-web应用安全测试方法

    本文转自乌云知识库 0x00前言 节选自:http://www.owasp.org.cn/OWASP_Conference/owasp-20140924/02OWASPWeb20140915.pdf 4.1 主动式(全自动):Web2.0、交互式漏洞扫描  4.2 半自动式漏洞分析:业务重放、url镜像,实现高覆盖度  4.3 被动式漏洞分析:应对0Day和孤岛页面 0x01主动式(全自动)Web扫描  •使用常见的漏洞扫描器 •自动fuzz,填充各种攻击性数据 •业务逻辑混淆,导致服务出错  •局限: •难以处理高交互式应用 •只能发现暴露给用户(搜索引擎)的链接,难以覆盖100%的业务链接 •解决方法:引入半被动式漏洞分析方法 •在人工未参与的情况下,50%以上的Web应用系统存在高危漏洞  0x02半自动式漏洞分析:业务重放+url镜像,实现高覆盖度  1.方法一:业务重放  测试过程使用burpsuit

  • .NET CORE EnvironmentVariable

    .NETCORE SystemvariablesSETInSystemvariablese.g1:Variablename:ASPNETCORE_ENVIRONMENTVariablevalue:Developmente.g2:Variablename:xxxDBConnectionStringVariablevalue:DataSource=(localdb)\\MSSQLLocalDB;InitialCatalog=DBNAME;UserID=usre;Password=123 .netcorecode: AddReference:Microsoft.Extensions.Configuration stringdbConnection=Environment.GetEnvironmentVariable("xxxDBConnectionString");Console.WriteLine(dbConnection); stringev=Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");Console

  • Codeforces Round #805 (Div. 3)(A~F,G待更)

    A B C D E F G + + +2 + + + -2 A 签到题不讲。 B 模拟题,每次要记录到的字母超过3个时就加一天。 时间复杂度\(\mathcal{O}(\sum|S|)\) C 不难发现要把\(u\)先离散化一波,设车站\(x\)所处最靠前的位置为\(Min_x\),最靠后的为\(Max_x\),每次询问\(a_i,b_i\)时,若\(Min_{a_i}\leMax_{b_i}\),显然就是可以的。 Tips:先判一下\(a_i,b_i\)是否在\(u\)中。(+2,悲) D 直接从最大的删就行。 E 若两个数对\((a,b),(c,d)\)中有两个数相等,那么这两个数对就不能放为一堆。将有相等数的数对相互连边,做一遍染色判断可行性(判断奇数个数环)。 F 设设\(a_i=2^{k}+a'_i(a'_i\in\mathbf{N})\)(\(k\)尽可能大)若\(b_j\)能通过若干次\(\lfloor\dfrac{x}{2}\rfloor\)操作转为\(a'_i\),那么\(b_j\)就能干掉\(a_i\),易得。(乘上若干次\(2\))

  • hashCode() 与 equals()

    一、hashCode()与equals()区别?   1、如果两个对象的hashCode 值相等,那这两个对象不一定相等(哈希碰撞)。   2、如果两个对象的hashCode 值相等并且equals()方法返回 true,这两个对象相等。   3、如果两个对象的hashCode 值不相等,这两个对象不相等。 二、重写equals()时必须重写hashCode()方法?   1、equals 方法判断两个对象是相等的,那这两个对象的 hashCode 值也要相等。   2、两个对象有相同的 hashCode 值,他们也不一定是相等的(哈希碰撞)

  • laravel5.8笔记九:数据库曾、更、查、删

    33 99999999

  • 计数算法

    计数算法 是什么? 计数(count)亦称数数。算术的基本概念之一。指数事物个数的过程。计数时,通常是手指着每一个事物,一个一个地数,口里念着正整数列里的数1,2,3,4,5等,和所指的事物进行一一对应,这种过程称为计数。计数是一个重复加(或减)1的数学行为,通常用于算出对象有多少个或放置想要之数目个对象(对第一个对象从一算起且将剩下的对象和由二开始的自然数做一对一对应)。上述逐个地计算事物的方法,称为逐一计数。若按几个一群的方法计数,则称为分群计数。 思想? 计数算法就是将我们所指的事物使用一些简单的东西来表示(例如可以使用数组的下标来记录我们的数据),之后根据数据进行重复加(或减)1的操作。最后根据题目要求进行改动。 运用范围? 典型运用:计数排序算法  例如:我所写的计数排序文章

  • bzoj 4873: [Shoi2017]寿司餐厅

    4873:[Shoi2017]寿司餐厅 2017-10-05 Description Kiana最近喜欢到一家非常美味的寿司餐厅用餐。每天晚上,这家餐厅都会按顺序提供n种寿司,第i种寿司有一个 代号ai和美味度di,i,不同种类的寿司有可能使用相同的代号。每种寿司的份数都是无限的,Kiana也可以无限次 取寿司来吃,但每种寿司每次只能取一份,且每次取走的寿司必须是按餐厅提供寿司的顺序连续的一段,即Kiana 可以一次取走第1,2种寿司各一份,也可以一次取走第2,3种寿司各一份,但不可以一次取走第1,3种寿司。由于餐 厅提供的寿司种类繁多,而不同种类的寿司之间相互会有影响:三文鱼寿司和鱿鱼寿司一起吃或许会很棒,但和水 果寿司一起吃就可能会肚子痛。因此,Kiana定义了一个综合美味度di,j(i<j),表示在一次取的寿司中,如果包含 了餐厅提供的从第i份到第j份的所有寿司,吃掉这次取的所有寿司后将获得的额外美味度。由于取寿司需要花费一 些时间,所以我们认为分两次取来的寿司之间相互不会影响。注意在吃一次取的寿司时,不止一个综合美味度会被 累加,比如若Kiana一次取走了第1,2,3

  • 【转】关于C#使用Excel的数据透视表的例子

    收到消息,下星期又有导出Excel报表的代码要写。心想,不就是OleDb先CREATE表,然后INSERT么?都是体力活啊...... 结果拿到纸张的报表,我就悲剧了。报表的结构,像下面这种结构,行/列都不确定的         因为行是日期,外部用户指定列是物品,可能有,可能没有,取决于外部用户的日期范围。 如果在C#里面,先把所有出现过的物品,作为列名然后再自己分别组合计算,最后再去OleDb那里去CREATE+INSERT嘛这个报表又有个那么大的标题。   假如显示的报表,是一个Sheet,报表的数据在另外一个Sheet里面。我C#导出Excel的时候,把数据写到一个[数据Sheet]里面。显示的[报表Sheet]里面,设置好引用那个[数据Sheet]的数据。想一下,应该是可行的。 既然应该是可行的,那么我C#里面,干脆连计算也别计算了。因为这样的效果,在Excel里面,使用数据透视表,点个三五下,就结束的工作。我还跑C#里面计算来计算去的,还容易出错。   首先嘛,先去创建一个模版Excel,2个Sheet1个[数据

  • ResultSet 处理方法

    结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等.   结果集读取数据的方法主要是getXXX(),他的参数可以使整型表示第几列(是从1开始的),还可以是列名.返回的是对应的XXX类型的值.如果对应那列时空值,XXX是对象的话返回XXX型的空值,如果XXX是数字类型,如Float等则返回0,boolean返回false.使用getString()可以返回所有的列的值,不过返回的都是字符串类型的.XXX可以代表的类型有:基本的数据类型如整型(int),布尔型(Boolean),浮点型(Float,Double)等,比特型(byte),还包括一些特殊的类型,如:日期类型(java.sql.Date),时间类型(java.sql.Time),时间戳类型(java.sql.Timestamp),大数型(BigDecimal和BigInteger等)等.还可以使用getArray(intcolindex/Stringcolumnname),通过这个方法获得当前行中

  • python实验一:画图

    题目:画图,学用rectangle画方形。 rectangle(intleft,inttop,intright,intbottom) 参数说明:(left,top)为矩形的左上坐标,(right,bottom)为矩形的右下坐标,两者可确定一个矩形的大小 Canvas #!usr/bin/envpython #-*-coding:utf-8-*- if__name__=='__main__':     fromTkinterimport*    #导入库 root=Tk()          #创建一个根窗口,其它事件将在这之上 root.title('Canvas')     #定义窗口标题 canvas=Canvas(root,width=400,height=400,bg='yellow')  #在根窗口上绘制宽高400背景颜色为黄色的窗口 x0=200 y0=200 y1=200 x1=200    #初始点设置 foriinrange(19):#进入循环,调用create_rectangle函数绘制矩形框 canvas.create_rectangle

相关推荐

推荐阅读