自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 资源 (1)
  • 收藏
  • 关注

原创 文章总汇

文章总汇JVM系列1,JVM概述2,JVM类加载子系统3,运行时数据区一4,运行时数据区二5,一文彻底明白String底层原理设计模式1,设计模式七大原则2,面试高频-吃透单例设计模式数据结构1,数据结构-单链表(一)(Java版)2,数据结构-双向链表(二)(Java版)3,数据结构-循环链表(三)(Java版)4,队列(java版)5,数据结构-二叉树(一 链式存储)(Java版)6,数据结构-平衡二叉树(AVL树)7,数据结构-二叉排序树(BST树)8,数据结构-(

2020-12-28 20:23:24 294

原创 剑指Offer算法索引

数组元素去重

2020-12-05 20:30:02 144

原创 使用Sklearn学习决策树

决策树文章目录决策树概述sklearn中的决策树sklearn的基本建模流程分类树DecisionTreeClassifier重要参数说明criterionrandom_state & splitter[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vAmwT22O-1632464362155)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]剪枝参

2021-09-24 14:20:00 18240 2

转载 ConcurrentHashMap源码解析

1. ConcurrentHashMap 1.7不使用HashMap是因为在多线程情况下会形成环形数据结构,不使用HashTable是因为使用的是重量级锁,效率比较低。segment在jdk1.7中是分段锁,在jdk1.8中没有segment对象1. 存储结构Java 7 中 ConcurrentHashMap 的存储结构如上图,ConcurrnetHashMap 由很多个 Segment 组合,而每一个 Segment 是一个类似于 HashMap 的结构,所以每一个 HashMap 的内部可

2021-09-01 14:25:46 466

原创 Spark启动报错问题

今天准备把Spark和Hive进行集成一下,当启动Spark的时候,报了如下错误:[rzf@hadoop100 spark]$ bin/spark-shell 21/06/04 11:52:20 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicableUsing Spark's default log4j pro

2021-06-04 12:06:03 1517

原创 Java多线程

`多线程文章目录程序,进程,线程的理解**进程****线程****程序****进程和程序的对比**并行与并发单`cpu`与多`cpu`的理解并发并行小结同步和异步思维导图总结Java线程创建线程的方法方式一:继承于`Thread`类方式二:使用 Runnable 配合 Thread原理之 Thread 与 Runnable 的关系方法三,FutureTask 配合 Thread查看进程的方法windowslinuxJava查看进程和线程的工具线程运行的原理jvm的栈与栈帧线程的运行原理线程的运行原理(多线

2021-05-05 21:19:39 820

原创 WINDOWS 10上面搭建Scala环境

1,下载对应的scala安装包在这里使用的是2.11.8版本,根据需要可以自行下载。2,解压安装包到其他的目录我把scala解压到d盘下,注意解压的路径上尽量不要有中文。然后可以在解压包下面新建一个目录,马上用于安装idea的插件。比如plugin目录。3,配置环境变量很重要的一步,千万配置环境变量哦!//配置SCALA_HOMED:\soft\scalaInstall//配置path%SCALA_HOME%\bin//配置CLASS_HOME%SCALA_HOME%\bin;%S

2021-01-29 09:54:50 439

原创 面试高频-吃透单例设计模式

文章目录单例设计模式单例设计模式的介绍单例模式的实现饿汉式(静态常量)饿汉式(静态代码块)懒汉式(线程不安全)懒汉式(线程安全1)懒汉式(线程安全2)双重检查静态内部类枚举单例模式在jdk源码中的分析单例模式注意事项**单例模式的应用场景**单例模式优缺点分析单例设计模式单例设计模式的介绍所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例, 并且该类只提供一个取得其对象实例的方法(静态方法)。比如 Hibernate 的SessionFactory,它充当数

2020-12-28 19:56:45 232

原创 设计模式的七大原则

文章目录设计模式的目的设计模式的七大原则单一职责原则基本介绍案例说明单一职责原则注意事项接口隔离原则(Interface Segregation Principle)基本介绍案例说明依赖倒转原则基本介绍案例说明依赖关系传递的三种方式和应用案例依赖倒转原则细节里式替换原则oo中继承性的思考基本介绍案例演示开闭原则基本介绍案例说明改进思路迪米特法则基本介绍应用案例迪米特法则细节合成复用原则(Composite Reuse Principle)基本介绍设计模式的目的编写软件过程中,程序员面临着来自耦合性,内聚

2020-12-23 21:20:10 213

原创 JVM系列-String-Table的理解

1,String的基本特性String:字符串,使用一对 “” 引起来表示String s1 = "hello" ; //字面量的定义方式String s2 = new String("hello"); // new 对象的方式String被声明为final的,不可被继承,如果字符串需要跨进程传输,是可以的,应为String实现了序列化接口。String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示Strin

2020-12-14 17:43:16 960 2

原创 Java参数传递(值传递还是引用传递)

文章目录基本类型和引用类型的区别下面我们再来看看==的作用值传递和引用传递的区别基本类型作为参数传递对象作为参数传递关于`String`参考资料基本类型和引用类型的区别int num = 10;String str = "hello";也就是说,对于基本类型的数据变量,他的值是直接存储在变量中,而str是一个引用类型的变量,变量中保存的是我们实际的对象在堆内存中的地址,而我们真实的对象,其实是存储在堆空间中的。下面我们再来看看==的作用num=20str="java"经过这样的操作,内

2020-12-11 14:14:28 1173 4

原创 数据结构-选择排序(简单选择排序,堆排序)

目录1,简单选择排序1.1,简单选择排序思想1.2,选择排序的时间复杂度分析1.3,简单选择排序代码实现2,堆排序2.1,什么是堆排序2.2,堆排序的思想2.3,堆排序时间复杂度分析2.4,代码实现1,简单选择排序1.1,简单选择排序思想选择排序(Selection sort)是一种简单直观的排序算法。 简单选择排序算法的比较次数和初始的序列排列顺序无关。 它的基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置;接着,.

2020-12-09 09:24:18 1739

原创 字符串匹配KMP算法

1,什么是字符串匹配假设现在随机输入一个长度为m的主串T,另外输入一个长度为n(n≤m)的字符串P,我们来判断字符串P是否是主串T的一个子串(即能否从T中随机取出与P同长的一段字符串,与P完全匹配)。这就是字符串问题的简单描述。1.1,蛮力法匹配蛮力法的思想:假设我们把子串和主串从第一个位置开始逐个字符进行匹配,如果相匹配的字符发现相等,也就是P[i]=T[j],那么我们就另i++,j++,逐个字符向后面进行匹配,但是如果P[i]!=T[j]的话,我们就重新设置j=0,i=i-j+1,重新开始匹

2020-12-07 11:23:04 505 1

原创 JVM系列-运行时数据区(二)

目录4.4,操作数栈4.4.1,概述4.4.2,操作数栈的作用4.5,代码追踪4.6,栈顶缓存技术ToS(Top-of-Stack Cashing)4.7,动态链接(Dynamic Linking)4.8,方法的调用,解析与分派4.9,方法返回地址4.10,相关题目4.11,本地方法栈接着上一次的运行时数据区一继续看,如果第一部分没有看的话,请在这里看:4.4,操作数栈4.4.1,概述栈 :可以使用数组或者链表来实现 每一个独立的栈帧中除了...

2020-12-05 20:55:22 307

原创 剑指Offer-数组去重

1,查找数组中的重复数字题目描述:1.1,思路一这个题目是一道简单题目,最容易想到的是对数组中的元素一趟排序操作,然后在扫描一趟数组,就可以查找出重复的元素。但是这样的话排序是这里面最耗时间的地方,排序一个长度为n的数组的时间复杂度是o(nlogn)。代码实现:/** * 排序方法查找数组中的重复元素 * @param arr 待排序数组 * @return 查找到重复元素就返回,否则返回-1 */ public static int dupli

2020-12-05 20:28:22 220

原创 阿里云搭建图床

文章目录写在前面软件安装购买阿里云`oss`存储对象注意事项写在前面各位老兄大家好,最近电脑出了一点小问题,所以微信公众号发表了一次文章也就没有后续了。哎!没办法,开发者怎能没有一台像样点的电脑呢?所以狠下心来给自己配置了一台电脑,具体型号就不说了,省得大家认为我在打广告,反正花了我几千大洋,看来以后得多多吃点泡面了,哈哈哈,,,,,,话不多说,接下来我们就步入正题,今天没有什么技术性的文章,而是聊聊我在写博客的过程中遇到的一个实际问题,markdown标记行语言相比很多人都了解,是一种轻量级标记言它允

2020-12-04 15:27:10 2965 1

原创 JVM系列-运行时数据区(一)

1,概述我们的字节码文件,经过类加载器的加载(加载,链接,初始化)后,在内存的方法区中,就保存我们的运行实例的本身,也就是类的各种信息。然后执行引擎使用我们的运行时数据区去执行程序。1.1,数据区的结构本地方法栈区域没有垃圾回收机制,堆和方法区有垃圾回收机制,pc寄存器也没有垃圾回收机制。 Oom:内存溢出异常,pc寄存器没有内存溢出情况,但是虚拟机栈区域和本地方法栈区域可能有内存溢出情况,heap area,method area也可能发生内存的溢出情况。 Pc寄存器既没有GC也没

2020-11-25 16:33:32 535

原创 ArrayList源码解读

目录1,ArrayList的简介2,ArrayList的源码分析2.1,ArrayList的数据结构2.2,类中的属性2.2,ArrayList的构造函数2.3,核心方法2.3.1,add()方法2.3.2,add(int index, E element),在特定位置添加元素2.3.3,remove(int)方法2.3.4,remove(Object)2.3.5,clear()方法2.3.6,indexOf(Object o),查找某一个对象的下标索引2

2020-11-23 08:26:55 195

原创 HashTable1.8源码解读

目录1,哈希表的简介1.1,HashTable的构造函数1.2,HashTable的属性说明1.3,HashTable的PAI2,HashTable的数据结构2.1,HashTable的内部类2.2,HashTable中重要方法分析2.2.1,put()方法2.2.2,addEntry()方法2.2.3,rehash()方法2.2.4,get()方法2.2.5,remove()删除元素方法2.3,哈希别中其他方法说明2.3.1,clear()方法2

2020-11-20 13:40:31 289 2

原创 数据结构-插入排序(直接插入排序,二分插入排序,希尔排序)

1,插入排序思想插入排序是一种简单直观的排序方法,其基本思想是每次将一个待排序的记录按其关键字大小插入到前面己排好序的子序列中,直到全部记录插入完成。由插入排序的思想可以引申出三个重要的排序算法:直接插入排序、折半插入排序和希尔排序。2,直接插入排序2.1,直接插入排序根据上面的插入排序思想,不难得出一种最简单也最直观的直接插入排序算法。假设在排序过程中,待排序表L [1...n ] 在某次排序过程中的某一时刻状态如下:有序序列L[1,2.........i-1] L(i)

2020-11-16 09:28:35 902

原创 数据结构-(2-3树,2-3-4树,B-树,B+树)

目录1,二叉树存在问题分析2,多叉树B树的介绍2.1,2-3树和2-3-4树的介绍2.2,B树的查找2.3,B树的创建和插入2.4,B树的删除3,B+树3.1,m 阶的B+树与m阶的B树的主要差异1,二叉树存在问题分析虽然我们说二叉排序树,平衡二叉树的查找操作效率较高,但是也存在问题, 请看下面的二叉树。二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题: 问题1:在构建二叉树时,需要多次进行i/

2020-11-16 09:26:35 1842

原创 数据结构-平衡二叉树(AVL树)

目录1,平衡二叉树的介绍1.1,二叉排序树存在的问题1.2,平衡二叉树1.3,平衡二叉树的创建1.4,平衡二叉树的查找2,代码实现2.1,平衡二叉树的节点类型2.2,LL旋转(单右旋转)2.3,RR旋转(单左旋转)2.4,向avl树中添加一个节点2.5,求左右子树的高度2.6,求平衡二叉树的高度2.7,中序遍历二叉树2.8,创建一颗平衡二叉树3,测试代码1,平衡二叉树的介绍1.1,二叉排序树存在的问题在介绍平衡二叉树之前,我们先来看看.

2020-11-15 15:13:00 2494 1

原创 数据结构-二叉排序树(BST树)

1,二叉排序树介绍二叉排序树(Binary Sort Tree)或者是一颗空树;或者是具有如下性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树又分别为二叉排序树。显然二叉排序树的定义是一个递归形式的定义,所以后面景禹要讲的插入、查找和删除都是基于递归的形式。特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点1.1,二叉排序树的构建假设我们有初始的无序...

2020-11-15 11:44:50 8862 2

原创 数据结构-红黑树原理

目录1,R-B-Tree的简介1.1,红黑树的特性2,红黑树的基本操作(一) 左旋和右旋和变色2.1,红黑树的基本操作(二) 添加2.2,红黑树的基本操作(三) 删除2.2.1,删除小结2.2.2,删除案例1,R-B-Tree的简介R-B Tree,全称是Red-Black Tree,又称为“红黑树”,红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。红黑树本质上是一种二叉查找树,但它在二叉查找树的基础上额外添加了一个标记(颜色),同时具有

2020-11-15 11:05:55 364

原创 HashMap1.7源码解读分析(一)

1,HashMap的使用声明一个HashMap集合。 向结合中添加元素,以键值对的形式。 获取集合中的某一个元素。 遍历结合元素(三种方式)。public class TestHashMap { public static void main(String[] args) {// 1 声明一个HashMap对象 Map<String,Integer> hashMap=new HashMap<String, Integer>();

2020-11-13 16:51:37 348

原创 赫夫曼编码(Java版)

目录1,赫夫曼树的介绍1.1,为什么会需要赫夫曼树1.2,赫夫曼树的构建1.3,字符传输案例2,创建赫夫曼编码2.1,赫夫曼树的节点类型2.1,将字节数组转换为赫夫曼树的节点类型2.2,创建一棵赫夫曼树2.3,构建赫夫曼编码表2.4,压缩数据2.5,压缩数据方法封装2.6,遍历操作2.7,解压缩2.7.1,将byte转换为字符串2.7.2,解压缩操作3,文件压缩3.1,文件压缩3.2,文件解压缩4,测试代码1,赫夫曼树的介绍

2020-11-11 12:14:27 1127 1

原创 Java集合系列-Collection&Map(一)

目录1,Java集合概要2,Collection接口的介绍3,List接口介绍4,Set集接口介绍5,AbstractCollection抽象类介绍6,AbstractList抽象类介绍7,AbstractSet抽象集介绍8,Iterator迭代器接口介绍9,ListIterator子接口介绍1,Java集合概要Collection是一个接口,Collection下面主要有三个接口分支,List,Set,Queue​​​​​​​。 为了方便,我们抽象..

2020-11-10 11:56:39 242

原创 详解Java-equals(),hashcode(),==的区别

目录1,我们先来看一个问题:Java 中 String str= "hello world" 和 String str = new String ("hello world") 的区别1.1,常量池1.2,String str="hello world"操作语句:1.3,使用new String创建字符串1.4,String拼接字符串1.5,String.intern():1.6,小结2,“==”用作关系运算符时3,equals()方法4,小结5,hashCode

2020-11-08 21:34:41 95

原创 Jvm系列-类加载子系统(二)

目录1,jvm内存结构的布局2,类加载子系统的作用3,类加载器(class loader)4,类的加载过程4.1,类的加载阶段(狭义上的加载)4.2,类的链接4.2.1,验证阶段(Verify)4.2.2,准备阶段(prepare)4.2.3,解析阶段(Resolve)4.3,初始化阶段5,类的加载器5.1,加载器的分类5.2,加载器的介绍5.3,获取ClassLoader的途径6,双亲委派机制6.1,jdbc加载举例6.2,双亲委派机制.

2020-11-08 17:46:55 866

原创 Jvm系列-Jvm概述(一)

目录1,什么是JVM?2,JVM跨平台及原理3,JVM的分类4,JVM的位置5,JVM的体系结构6,Java代码的执行流程7,JVM的架构模型8,JVM的生命周期9,三大商业虚拟机1,什么是JVM?JVM 是 java虚拟机,是用来执行java字节码(二进制的形式)的虚拟计算机。 jvm是运行在操作系统之上的,与硬件没有任何关系。2,JVM跨平台及原理跨平台:由Java编写的程序可以在不同的操作系统上运行:一次编写,多处运行。 原理:编译之后的字节码

2020-11-07 20:15:55 55416 6

原创 数据结构-二叉树(一 链式存储)(Java版)

目录1,二叉树的介绍1.1,树的定义1.2,概念解释2,二叉树2.1,二叉树的特点2.2,二叉树的性质2.3,斜树2.4,满二叉树2.5,完全二叉树3,二叉树的实现3.1,二叉树的节点类型3.2,二叉树遍历操作(递归实现)3.2.1,前序遍历递归实现3.2.2,中序遍历递归实现3.2.3,后序遍历递归实现3.3,二叉树的遍历操作(非递归实现)3.3.1,前序遍历非递归实现3.3.2,中序遍历非递归实现3.3.3,后序遍历非递归实现.

2020-11-07 11:37:44 395

原创 数据结构-查找算法(Java版)

目录1,查找算法概述1.1,查找算法的分类1.2,查找的性能衡量指标-平均查找长度(Average Search Length,ASL)1.3,查找性能2,查找算法实现2.1,顺序查找2.1.1,顺序查找复杂度分析2.1.2,代码实现2.2,二分查找算法2.2.1,复杂度分析2.2.2,二分查找代码实现2.2.3,算法改进2.3,插值查找算法2.3.1,代码实现2.4,斐波那契(黄金分割法)查找算法2.4.1,斐波那锲查找算法原理2.4..

2020-11-06 21:52:29 447

原创 数据结构-哈希表(Java版)

目录1,什么是哈希表1.1,如何解决哈希碰撞问题1.2,哈希表有什么优势呢?2,链表的实现2.1,哈希表中的节点类型2.2,链表的定义2.2.1,链表的节点定义2.2.2,向链表末尾添加一个元素2.2.3,在链表中查找一个元素2.2.4,在链表中删除一个元素2.2.5,打印链表3,哈希表的实现3.1,定义一个哈希表3.2,向哈希表中添加一个元素3.3,获取元素索引3.4,哈希表的遍历3.5,在哈希表中查找一个元素3.6,在哈希表中删除一

2020-11-06 20:50:20 260

原创 数据结构-循环链表(三)(Java版)

目录1,什么是循环链表2,循环链表的实现2.1,循环链表节点的定义2.2,循环链表的实现2.2.1,定义一个循环链表2.2.2,向循环链表末尾添加一个元素2.2.3,打印循环链表2.2.4,根据元素值删除循环链表中的一个节点2.2.5,约瑟夫环问题的实现1,什么是循环链表循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。下面使用一张说明什么是循环链表:循环链表在逻辑上形成的是一个环,是

2020-11-06 20:18:33 254

原创 数据结构-双向链表(二)(Java版)

目录1,什么是双向链表?2,双向链表的实现2.1,双向链表的节点类型2.2,双向链表的实现2.2.1,定义一个双向链表2.2.2,向双向链表的末尾插入一个元素2.2.3,向双向链表的头添加一个元素2.2.4,根据索引向双向链表中任意一个位置插入一个元素2.2.5,根据元素值删除双向链表中的一个节点2.2.6,遍历双向链表1,什么是双向链表?双向链表(double linked list)是在单链表的每个结点中,再设置一个指向其前驱结点的指针。所以在双向链表中.

2020-11-06 19:39:24 160

原创 数据结构-单链表(一)(Java版)

目录1,什么是单链表?2,单链表的实现2.1,单链表的节点类型2.2,单链表的实现2.2.1,定义一个单链表2.2.1,头插法插入一个节点2.2.2,采用尾插法插入一个节点2.2.3,删除单链表中的一个节点2.2.4,打印出一条单链表3,关于单链表面试题目简单练习3.1,查找单链表中第k个节点3.2,单链表的反转3.3,从尾到头打印单链表3.4,合并两个有序的单链表3.5,单链表的小结1,什么是单链表?单链表 [LinkedList]:由各

2020-11-06 17:44:31 173

原创 使用sklearn学习多项式回归(三)

1,什么是线性我们无数次提到”线性“这个名词。在支持向量机中,我们也曾经提到最初的支持向量机只能够分割线性可分的数据,然后引入了”核函数“来帮助我们分类那些非线性可分的数据。我们也曾经说起过,比如说决策树,支持向量机是”非线性“模型。所有的这些概念,让我们对”线性“这个词非常熟悉,却又非常陌生——因为我们并不知道它的真实含义。接下来我们看看线性回归模型改进的核心之一:帮助线性回归解决非线性问题。1.1,变量之间的线性关系”线性“这个词用于描述不同事物时有着不同的含义。我们最常使用的线性是指“变量

2020-11-06 15:55:51 3090

原创 使用sklearn库学习线性回归(二)

1,多重共线性问题(Ridge回归和Lasso回归)1.1,什么是多重共线性我们在对多元线性回归的损失函数求导,并得出求解系数的式子和过程,在最后一步中我们需要左乘的逆矩阵,而逆矩阵存在的充分必要条件是特征矩阵不存在多重共线性。首先解释一下逆矩阵存在的充分必要条件:也就是矩阵的行列式不等于零,对于线性回归而言,即是说不能为0。这是使用最小二乘法来求解线性回归的核心条件之一。但是行列式不为零的充分必要条件是矩阵要满秩,求矩阵的秩我们一般使用行变换的方法,转换为阶梯型的矩阵,这些概念都是线...

2020-11-05 14:36:23 2341

原创 使用sklearn库学习线性回归(一)

1,概述1.1,判别式方法产生式模型需要计算输入输出的联合概率 需要知道(or 假定)样本的概率分布 定义似然密度的隐式参数 为没给类别搜索最大化样本似然的参数 也称为基于似然的分类(Likelihood-based Classification) 判别式模型直接构造(假定)判别式 。 判别式的显式参数(特征变量的权重)。 判别式方法 基于似然的方法关注类区域中的概率密度 基于判别式的方法只关注类区域之间的边界。 1.2,线性回归介绍回归是一种应

2020-11-02 12:05:35 10100 1

原创 数据结构-交换排序(冒泡算法,快速排序)

1,冒泡排序思想冒泡算法是一种基于交换思想的排序算法,算法每次都和相邻的两个元素比较,把比较结果比较大的哪一个元素逐渐的交换到最后的位置,经过n-1趟比较后,整个序列有序。可以看到,冒泡算法的每一趟排序都有一个元素被放到最终的位置,下面我们通过一个例子看看冒泡排序的过程。2,冒泡排序过程分析首先看我们的原始数据,每次都把前面的一个元素和后面的一个元素比较,如果前面元素小于后面元素,不发生交换,如果前面元素大于后面元素,就发生交换,直到遍历完所有的元素,此时我们的第一趟排序完成,从结果来看,我

2020-10-28 12:20:38 782

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除