学习数据结构的第六天(一)(包括一些还没学习的,指导之后学习的要点)

现在看一下,set和map的作用,以及treeset的作用。

对于以后还需要学哪些:

对于相应的时间复杂度的分析、对于排序的相应内容,都是需要再看的。

什么最好、最坏之类的。

自写数据结构对于leetcode相应代码的实现也要学,在哪些部分去写private class 在哪些部分去写private interface,都要学。

对于之前学过的计算机网络、操作系统等知识,需要先复习已经学过的了。然后的话再去根据面试添加内容。

set和map的相应内容:

如果说自己去写相应的实现,

Set<String> set = new HashSet<>();

Set<String> set = new TreeSet<>();

Map<String, Student> map = new HashMap<>();

Map<String, Integer> map = new TreeMap<>();

这里说的是: 如果说自己去写,那么应该使用什么,应该使用:  HashSet ----》   不需要排序的set

treeset---需要排序的set。    hashMap---不用排序的map ,treemap---需要排序的map。

然后的话知道:什么时候应该使用set :希望放到里面的元素无重复时,应该使用set

什么时候应该使用map:希望建立的是:一对一的映射时,那么就使用map。

那么pair和map的区别,自己也知道,使用pair是更加轻量级的。

通过key计算索引的方式就是调用key对象的hashCode()方法,它返回一个int整数。HashMap正是通过这个方法直接定位key对应的value的索引,继而直接返回value

因此,正确使用Map必须保证:

  1. 作为key的对象必须正确覆写equals()方法,相等的两个key实例调用equals()必须返回true
  2. 作为key的对象还必须正确覆写hashCode()方法,且hashCode()方法要严格遵循以下规范:
  • 如果两个对象相等,则两个对象的hashCode()必须相等;
  • 如果两个对象不相等,则两个对象的hashCode()尽量不要相等。

这里说的是:放入,使用map的时候的注意点是什么:

如果说使用到了任何一个容器去查找某个元素(search、contains)的功能,那么需要这个类的对象实现equals函数。

原因:它们是否相等,需要去定义这个内容。对于基本的数据类型,引用的string类型,它们都是已经写好了这部分内容在里面的。

  1. 作为key的对象还必须正确覆写hashCode()方法,且hashCode()方法要严格遵循以下规范:
  • 如果两个对象相等,则两个对象的hashCode()必须相等;
  • 如果两个对象不相等,则两个对象的hashCode()尽量不要相等。

hashCode函数的作用:根据对象,得到它们的哈希码。  那么list查找

我们把不同的key具有相同的hashCode()的情况称之为哈希冲突。在冲突的时候,一种最简单的解决办法是用List存储hashCode()相同的key-value。显然,如果冲突的概率越大,这个List就越长

这里说的是:为什么map需要覆写hashcode函数,因为map是根据对象,找到hashcode值,再去找到指定的对象的。

即:如果需要查找某些东西,那么要写equals,如果说map,除了这个之外,如果你是作为key的,那么还要去覆写hashcode函数。

那么如果自己去写实现的话:

那么linkedlist可以作为map,作为set的实现。

bst可以作为map,作为set的实现,那么它里面的set东西是排序过的,map的key也是排序过的。(因为二叉搜索树里面的添加就是按照顺序来添加的)

BSTMap<K extends Comparable<K>, V> implements Map<K, V>

这句话是非常好的,因为:如果说里面持有的元素是需要去比较的,所以说第一个元素需要去extends comparable的类。

而它们整体,是作为map的实现。

如果说分成四个文件的结构,那么

1底层容器

2.如何用底层容器是实现的接口,记住,这个位置是持有底层容器的位置,如上面的第二个图。

3.接口:只写抽象的函数

这里是教如何去自己写接口、写如何实现接口等。

以下是双文件结构:

其实main函数还没写,相当于三文件结构来的。

把node作为私有的类进行存储

把相应的函数都给直接放进来,把相应的linkedlist的函数都直接进行合并进来。

就是把:底层容器的持有,这部分内容改了。不持有底层容器,直接写底层容器是如何实现的。

以下是单文件结构,常用于:leetcode代码之类的。

但是也注意:leetcode的代码,一般都是直接写现有的实现吧,都是已经有现有的实现了,直接去调用就行了。

1.把interface也变成是private的持有

2.把相应的实现接口的,也变成是private的持有类。

3.当然,也是把底层容器,给融合到了这个  实现接口的  东西里面去。

这里说的是单文件结构的做法

这一节先到这,然后去把相应的给做了之后再继续分析。

原文地址:https://www.cnblogs.com/startFrom0/p/12614570.html

时间: 2024-11-05 16:02:16

学习数据结构的第六天(一)(包括一些还没学习的,指导之后学习的要点)的相关文章

自己学习的范围很广,但是,还没精通一种语言编程,呵呵

我是一个好学习的人,但是,很多东西没有学好,但是,学的比较多,我总结了一下.呵呵. 熟悉Java,有Java编程功底和良好的编程习惯:熟练使用JSP.Servlet.JDBC等进行Java编程开发:熟练使用EL.JSTL;熟悉struts.Hibernate.spring.Mybatis等开源框架,能熟练的进行SSH整合开发:熟练使用Eclipse.Myeclipse等开发工具:熟练使用tomcat服务器进行Java Web开发和部署:熟练使用HTML.Javascript.Ajax.jQuer

进一步学习设计模式(4)设计模式/三角还没没有总结完成

从1995年至今,无论是在大型API或框架(例如JDK..NET Framework等).轻量级框架(例如Struts.Spring.Hibernate.JUnit等).还是应用软件的开发中,设计模式都得到来广泛应用. 正在从事面向对象开发或正准备从事面向对象开发的技术人员,无论是使用Java.C#.VB.NET.Smalltalk等纯面向对象编程语言,还是使用C++.PHP.Javascript等可支持面向对象编程的语言,都应该懂一点设计模式. 利用设计模式,通过一些成熟的设计方案来指导新项目

数据学习---数据结构1

学习数据结构,对数据结构的一些总结和相关东西的记录. 数据是指能输入到计算机中并能被计算机程序处理的符号的总称. 数据元素是数据的基本单位,作为一个整体进行处理. 数据项是构成数据元素不可分割的最小单位. 数据<---(基本单位)数据元素<---(可由若干个数据项组成)数据项 -------------------------------------------------------- 数据对象是具有相同性质的数据元素的集合,它是数据的子集. 数据结构是相互之间存在着某种关系的数据元素的集合

我是如何学习数据结构与算法的?

数据结构与算法的地位对于一个程序员来说不言而喻.今天这篇文章不是来劝你们学习数据结构与算法的,也不是来和你们说数据结构与算法有多重要.主要是最近几天后台有读者问我是如何学习数据结构与算法的,有没有什么捷径,是要看视频还是看书,去哪刷题等-..而且有些还是大三大四的,搞的我都替你们着急.担心-..所以我今天就分享下自己平时都是怎么学习的. 学习算法的捷径就是多刷题 说实话,要说捷径,我觉得就是脚踏实地着多动手去刷题,多刷题.但是,如果你是小白,也就是说,你连常见的数据结构,如链表.树以及常见的算法

学习数据结构的意义

1,为什么要学习数据结构? 1,语言学习结束之后是否有能力进行项目开发? 1,不能,要学习数据结构: 2,当面对一个问题的时候如何思考解决方案? 1,多练习: 2,通过学习数据结构这门课程进一步训练: 3,如何判断代码效率的高低好坏? 1,数据结构里面的准则: 4,怎样才能提高自己的编程能力? 1,多练习.多思考: 2,通过学习数据结构来练习提高数据编程能力: 2,学习数据结构意义: 1,培养专业的程序设计思维: 1,语言只会越来越简单.越来越多的人会掌握一门语言: 2,语言只是工具,必须练习程

学习数据结构和算法的两个利器

数据结构和算法的重要性想必各位在江湖上早就有所耳闻.它对我们最直接的影响就是面试,一般来说,程序员一面都会涉及数据结构和算法知识,尤其是当前找工作比较难的情况下,各个公司会更加重视对候选人基本能力的考察.另外的影响是工作,以我为例,最开始在一家小公司做大数据的时候,由于数据量较大而计算资源不足,所以需要想尽各种办法优化软件的性能.最难解决的问题就是空间搜索效率,当时用了kd-tree这种数据结构,以及最短路径算法(SPFA).当然大部分情况下像这种常见的算法调用现有的包即可,但有些时候需要结合业

一步一步学习数据结构(三)栈的顺序存储结构实现代码

//栈这种逻辑结构的实现与一般线性表的实现类似,有两种存储方式:顺序存储和链式存储 //先学习顺序存储 //1. #include<stdio.h> #include<stdlib.h> #define null NULL #define SIZE 100 typedef int dataType ; typedef struct { dataType data[SIZE]; int top; }cStack,*cStackPointer; //初始化栈空间 void initSt

SqList *L 和 SqList * &amp;L的区别/学习数据结构突然发现不太懂 小祥我查找总结了一下

小祥在学习李春葆的数据结构教程时发现一个小问题,建立顺序表和输出线性表,这两个函数的形参是不一样的. 代码在这里↓↓↓ 1 //定义顺序表L的结构体 2 typedef struct 3 { 4 Elemtype data[MaxSize]: 5 int length; 6 }SqList; 7 8 //建立顺序表 9 void CreateList(SqList * &L,ElemType a[ ],int n) 10 { 11 int i; 12 L = (SqList * )malloc(

【js类库AngularJs】学习angularJs的指令(包括常见表单验证,隐藏等功能)

[js类库AngularJs]学习angularJs的指令(包括常见表单验证,隐藏等功能) AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心的 是:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入.等等. 参考资料: angularjs中文网:http://www.apjs.net/ angularjs官网:http://angula