java 从set取值_怎样从java集合类set中取出数据?

展开全部

创建set的copyiterator方法:

Set set = new HashSet();

Iterator it = set.iterator();

while(it.hasNext())//判断是否有下一个

it.next()取出bai元素。

以上du方法便是从Set集合中zhi取出数据。

1728f95702ca586e4f7b9a6e557502d2.png

扩展资料dao:

Java中使用Set接口描述一个集合(集合不允许有“重复值”,注意重复的概念),集合Set是Collection的子接口,Set不允许其数据元素重复出现,也就是说在Set中每一个数据元素都是唯一的。Set接口定义的常用方法如下:

1、size()    获取Set尺寸(即Set包含数据元素的总数)。

2、 add(Object obj)    向Set中添加数据元素obj。

3、remove(Object obj)    从Set中移除数据元素obj。

4 、contains(Object obj)    判断当前Set中是否包含数据元素obj,如果包含返回true,否则返回false。

5、 iterator()    将Set装入迭代器。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VBSCRIPT文手册,这里的信息可以帮你很方便地浏览 Visual Basic 脚本的许多不同部分。 你可以找到在按字母排序的关键字列表列出的 VBScript 语言的所有部分。如果你只想调阅某一部分,例如“对象”,那么语言的每一部分都有它自己更严密的章节。 如何查找呢?单击左边的某个标题,即显示该部分包含的项目列表。从这张列表选择要查看的主题。当这个主题打开后,再链接到其他相关的部分就简单多了。 好了,让我们试一试,体会体会!学习几个语句,研究几种方法,或者熟悉几个函数。你就能学会如何巧妙地运用 VBScript 语言,充分发挥 VBScript 语言的强大功能。 特性 说明 VBScript 特性 VBScript 最新特性列表 未包含在 VBScript 的 VBA 特性 VBScript 最新特性列表:未包含在 VBScript 的应用程序编辑。 未包含在 VBA 的 VBScript 特性 未包含在 Visual Basic 的 VBScript 特性列表:应用程序编辑。 Microsoft Scripting 运行时特性 VBScript 最新的 Scripting 运行时特性列表。 语言元素 说明 Abs 函数 返回数的绝对值。 加法运算符 (+) 两数相加。 And 运算符 执行两个表达式的逻辑连接。 Array 函数 返回含一数组的 变体 。 Asc 函数 返回字符串首字母的 ANSI 字符代码。 赋值运算符 (=) 给变量或属性赋值。 Atn 函数 返回数的反正切值。 调用语句 将控制移交 Sub 或 Function 过程。 CBool 函数 返回已被转换为 Boolean 子类型的变体的表达式。 CByte 函数 返回已被转换为字节子类型的变体的表达式。 CCur 函数 返回已被转换为货币子类型的变体的表达式。 CDate 函数 返回已被转换为日期子类型的变体的表达式。 CDbl 函数 返回已被转换为双精度子类型的变体的表达式。 Chr 函数 返回指定 ANSI 字符码的字符。 CInt 函数 返回已被转换为整数子类型的变体的表达式。 Class 对象 提供对已创建的类的事件的访问。 Class 语句 声明类名 Clear 方法 清除 Err 对象的所有属性设置。 CLng 函数 返回已被转换为 Long 子类型的变体的表达式。 颜色常数 颜色常数列表。 比较常数 用于比较运算的常数列表。 连接运算符 (&) 强制两个表达式的字符串连接。 Const 语句 声明用于字母值的常数。 Cos 函数 返回角度的余弦值。 CreateObject 函数 创建并返回对“自动”对象的引用。 CSng 函数 返回已被转换为单精度子类型的变体的表达式。 CStr 函数 返回已被转换为字符串子类型的变体的表达式。 日期和时间常数 在日期和时间运算用来定义星期几和其他常数的常数列表。 日期格式常数 用于日期和时间格式的常数列表。 Date 函数 返回当前系统日期。 DateAdd 函数 返回加上了指定的时间间隔的日期。 DateDiff 函数 返回两个日期之间的间隔。 DatePart 函数 返回给定日期 的指定部分。 DateSerial 函数 返回指定年月日的 日期子类型的变体 。 DateValue 函数 返回日期子类型的变体 。 Day 函数 返回日期,取值范围为 1 至 31。 Description 属性 返回或者设置说明某个错误的字符串。 Dictionary 对象 存储数据键、项目对的对象。 Dim 语句 声明变量并分配存储空间。 除法运算符 (/) 两数相除并以浮点数格式返回商。 Do...Loop 语句 当条件为 True 或者当条件变为 True 时,重复一语句块。 Empty 表示尚未初始化的变量值。 Eqv 运算符 使两个表达式相等。 Erase 语句 重新初始化固定数组的元素并重新分配动态数组的存储空间。 Err 对象 含有关于运行时错误的信息。 Eval 函数 计算并返回表达式的值。 Execute 方法 根据指定的字符串,执行正则表达式的搜索。 Execute 语句 执行单个或更多的指定语句。 Exit 语句 退出 Do...Loop、For...Next、 Function 或 Sub 代码块。 Exp 函数 返回 e (自然对数的底)的多少次方。 自乘运算符 (^) 指数函数,幂为自变量。 False 关键字,其值为零。 FileSystemObject 对象 提供对计算机文件系统的访问。 Filter 函数 根据指定的筛
求交集和并集的线性算法(原创) 对于给定的两个集合,使用哈希表可以在线性时间复杂度内得到他们的交集和并集,具体说明如下: 假设有集合A={1, 7, 5, 13, 9, 10, 11}, B={5, 7, 10, 1, 18, 12}, 1)求交集,需要得到结果:A∩B={1, 5, 7,10} 思路如下: ①建立一个哈希表(HashTable),其键(KEY)表示集合数字的值,其值(VALUE)表示集合数字出现的次数 ②遍历集合A,将集合的每个数字(KEY)插入哈希表,每个数字的出现次数(VALUE)设置为1 ③遍历集合B,对于集合的每个数字: 如果哈希表已经存在该数字,将对应的VALUE改为2 如果哈希表不存在该数字,忽略 ④遍历哈希表,输出VALUE为2的数字,即得到A和B的交集 2) 求并集,需要得到结果:AUB={1,5,7,9,10,11,12,13,18} 思路如下: ①建立一个哈希表(HashTable),其键(KEY)表示集合数字的值,其值(VALUE)可以无视 ②遍历集合A,将集合的每个数字(KEY)插入哈希表 ③遍历集合B,对于集合的每个数字: 如果哈希表已经存在该数字,忽略 如果哈希表不存在该数字,将这个数字插入哈希表 ④遍历哈希表,输出哈希表的每个KEY,即为A和B的并集 上面以两个集合为例说明了交集和并集的求法,事实上,上述算法可以很方便的扩展到3个或3个以上的集合 的求交集和求并集。另外求并集时,由于哈希表的值(VALUE)部分不需要用到,所以这个数据结构也可以更换为 哈希集(HashSet)。 转载请注明出处。 VBHashTable 2012-08-20 14:43:21| 分类: asp.net|举报|字号 订阅 首先定义一个hashtable Dim hstl As New Hashtable hstl.Add(key, value) 'java是用.put MS开始全面模仿java 这说说vb.net的hashtable基本用法: 添加值:hstl.add(key,value) 通过key取值: hstl.Item(key).ToString 判断是否含有Key: ContainsKey(key) 判断是否含有value: ContainsValue(value) 遍历hashtable: Dim de As DictionaryEntry '泛型类 For Each de In hstl console.write(de.key & de.value) Next de hashtable不支持通过value取key. 求2个集合的交集 第一种方法 最简单、粗暴的循环遍历2个集合,判断如果有相同的元素就取出来。假设集合1的长度为M,集合2的长度为N,那么,时间复杂度为:O(M*N) 代码: public static List<string> GetIntersection(List<string> list1, List<string> list2) { List<string> list3 = new List<string>(); //第一种方法:循环遍历 //O(n×m) for (int i = 0; i < list1.Count; i++) { for (int j = 0; j < list2.Count; j++) { if (list1[i]==list2[j]) { list3.Add(list1[i]); } } } return list3; } 第二种方法 利用hash这种很有用的数据结构来实现。我们知道,hash的特点之一就是不允许有重复元素,即hash表的元素都是唯一的。所以,我们的思路就是:先把第一个集合的所有元素都放进hashSet,时间复杂度O(M);再把第二个集合的元素放进hashSet,如果有重复元素,就是这2个集合的交集,时间复杂度为O(N)。即总的时间复杂度从O(M*N)降低到了O(M+N)。 代码: public static List<string> GetIntersection2(List<string> list1, List<string> list2) { //第二种方法:hash List<string> list3 = new List<string>(); HashSet<string> hashSet = new HashSet<string>(); foreach (string item in list1) { hashSet.Add(item); } foreach (string item in list2) { if (hashSet.Add(item) == false) { list3.Add(item); } } return list3; } 测试 代码: static void Main(string[] args) { List<string> list1 = new List<string>(); list1.Add("apple"); list1.Add("banana"); list1.Add("pear"); list1.Add("orange"); list1.Add("grape"); List<string> list2 = new List<string>(); list2.Add("nokia"); list2.Add("sumsung"); list2.Add("htc"); list2.Add("apple"); list2.Add("orange"); List<string> list =new List<string>(); //test for two set join //list = TwoSetsIntersection.GetIntersection(list1, list2); list = TwoSetsIntersection.GetIntersection2(list1, list2); foreach (string item in list) { Console.Write(item + "\t"); } } 总结 hash的另一个特点是查找效率为O(1),惊人的高! 对于这道题目要是算出来O(M*N)的同学就应该补课了。出来混,迟早要还的。 HashSet<T>类 HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集、并集、差集等。集合包含一组不重复出现且无特性顺序的元素。 HashSet<T>的一些特性如下: 1、HashSet<T>的值不能重复且没有顺序。 2、HashSet<T>的容量会按需自动添加。 构造方法: HashSet() 默认相等比较器创建一个空的新实例。 HashSet(IEnumerable<T> collection)  把指定集合的collection数据复制到集 HashSet(IEqualityComparer<T> comparer)  使用指定的相等比较器创建一个空的新实例 HashSet(IEnumerable<T> collection,IEqualityComparer<T> comparer)  使用指定的比较器实例化数据,且将指定集合的元素复制到集合。 因为HashSet<T>是专门设计来做集合运算的,因此它提供的方法有不少是和集合运算相关的。 以下给出它的一些常用方法介绍 成员        类型        说明 Add        方法        将指定的元素添加到集合 Clear        方法         清空集合的所有元素 Contains     方法         确定某元素是否在HashSet<T> Exists       方法         确定HashSet<T>是否包含于指定条件相匹配的元素 ExceptWith    方法         从当前HashSet<T>移除指定集合的所有元素 IntersectWith   方法        修改当前的HashSet<T>对象,以仅包含该对象和指定集合存在的元素 IsProperSubsetOf  方法        确定HashSet<T>对象是否为指定集合的真子集 IsProperSupersetOf 方法        确定HashSet<T>对象是否为指定集合的真超集 IsSunsetOf     方法         确定HashSet<T>对象是否为指定集合的子集 IsSupersetOf    方法         确定HashSet<T>对象是否为指定集合的超集 Remove      方法         从HashSet<T>对象移除指定的元素 RemoveWhere   方法         从HashSet<T>集合移除与指定谓词所定义的条件相匹配的所有元素 SetEquals     方法         确定HashSet<T>对象与指定的集合是否包含相同的元素 SynmmetricExceptWith  方法     修改当前的HashSet<T>对象,以仅包含该对象或指定集合存在的元素 TrimExcess    方法         将HashSet<T>对象的容量设置为它所包含的元素的实际个数,向上舍入为接近的特性与实现的值。 UnionWith     方法         修改当前的HashSet<T>对象,以包含该对象本身和指定集合存在的所有元素 给个简单的例子,写不完的,总之记得HashSet<T>主要的作用是用来进行,交集、并集等运算的就OK了。 static void Main(string[] args) { HashSet<string> hs = new HashSet<string>(); hs.Add("你"); hs.Add("好"); hs.Add("吗"); HashSet<string> hs1 = new HashSet<string>(); hs1.Add("你"); hs1.Add("好"); bool b = hs1.IsProperSubsetOf(hs); //确定hs1是否是hs的真子集 Console.WriteLine(b); //输出True HashSet<string> hs2 = new HashSet<string>(); hs2.Add("爱你"); IEnumerable<string> list = hs.Union(hs2); //返回并集 foreach (string str in list) { Console.WriteLine(str); //输出 你 好 吗 爱你 } Console.ReadKey(); }
C#版本数据结构,用C#的同志们有福啦 本书节选: 第1章 绪论 数据是外部世界信息的计算机化,是计算机加工处理的对象。运用计算机处 理数据时,必须解决四个方面的问题:一是如何在计算机方便、高效地表示和 组织数据;二是如何在计算机存储器(内存和外存)存储数据;三是如何对存 储在计算机数据进行操作,可以有哪些操作,如何实现这些操作以及如何对 同一问题的不同操作方法进行评价;四是必须理解每种数据结构的性能特征,以 便选择一个适合于某个特定问题的数据结构。这些问题就是数据结构这门课程所 要研究的主要问题。本章首先说明学习数据结构的必要性和本书的目的,然后解 释数据结构及其有关概念,接着讨论算法的相关知识,最后简单介绍本书所要用 到的相关数学知识和C#知识。 1.1 数据结构 1.1.1 学习数据结构的必要性 我们知道,虽然每个人都懂得英语的语法与基本类型,但是对于同样的题目, 每个人写出的作文,水平却高低不一。程序设计也和写英语作文一样,虽然程序 员都懂得语言的语法与语义,但是对于同样的问题,程序员写出来的程序不一样。 有的人写出来的程序效率很高,有的人却用复杂的方法来解决一个简单的问题。 当然,程序设计水平的提高仅仅靠看几本程序设计书是不行的。只有多思索、 多练习,才能提高自己的程序设计水平;否则,书看得再多,提高也不大。记得 刚学程序设计时,常听人说程序设计水平要想提高,最重要的是多看别人写的程 序,多去思考问题。从别人写的程序,我们可以发现效率更高的解决方法;从 思考问题的过程,我们可以了解解决问题的方法常常不只一个。运用先前解决 问题的经验,来解决更复杂更深入的问题,是提高程序设计水平的最有效途径。 数据结构正是前人在思索问题的过程所想出的解决方法。一般而言,在学 习程序设计一段时间后,学习“数据结构”便能让你的程序设计水平上一个台阶。 如果只学会了程序设计的语法和语义,那么你只能解决程序设计三分之一的问 题,而且运用的方法并不是最有效的。但如果学会了数据结构的概念,就能在程 序设计上,运用最有效的方法来解决绝大多数的问题。 《数据结构》这门课程的目的有三个。第一个是讲授常用的数据结构,这些 数据结构形成了程序员基本数据结构工具箱(toolkit)。对于许多常见的问题,工 具箱里的数据结构是理想的选择。就像.NET Framework Windows应用程序开 发的工具箱,程序员可以直接拿来或经过少许的修改就可以使用,非常方便。 第二个是讲授常用的算法,这和数据结构一样,是人们在长期实践过程的总结, 程序员可以直接拿来或经过少许的修改就可以使用。可以通过算法训练来提高程 序设计水平。第三个目的是通过程序设计的技能训练促进程序员综合能力的提 高。 1.1.2 基本概念和术语 在本小节,将对一些常用的概念和术语进行介绍,这些概念和术语在以后 的章节会多次出现。 1、数据(Data) 数据是外部世界信息的载体,它能够被计算机识别、存储和加工处理,是计 算机程序加工的原料。计算机程序处理各种各样的数据,可以是数值数据,如整 数、实数或复数;也可以是非数值数据,如字符、文字、图形、图像、声音等。 2、数据元素(Data Element)和数据项(Data Item) 数据结构(C#语言版) 1.1 数据结构2 数据元素是数据的基本单位,在计算机程序通常被作为一个整体进行考虑 和处理。数据元素有时也被称为元素、结点、顶点、记录等。一个数据元素可由 若干个数据项(Data Item)组成。数据项是不可分割的、含有独立意义的最小数据 单位,数据项有时也称为字段(Field)或域(Domain)。例如,在数据库信息处理系 统数据的一条记录就是一个数据元素。这条记录的学生学号、姓名、 性别、籍贯、出生年月、成绩等字段就是数据项。数据项分为两种,一种叫做初 等项,如学生的性别、籍贯等,在处理时不能再进行分割;另一种叫做组合项, 如学生的成绩,它可以再分为数学、物理、化学等更小的项。 3、数据对象(Data Object) 数据对象是性质相同的数据元素的集合,是数据的一个子集。例如,整数数 据对象是{0,±1,±2,±3,…},字符数据对象是{a,b,c,…}。 4、数据类型(Data Type) 数据类型是高级程序设计语言的概念,是数据取值范围和对数据进行操 作的总和。数据类型规定了程序对象的特性。程序的每个变量、常量或表达 式的结果都应该属于某种确定的数据类型。例如,C#语言的字符串类型(String, 经常写为string)。一 个String表示一个恒定不变的字符序列集合,所有的字符序 列集合构成String的取值范围。我们可以对String进行求长度、复制、连接两个 字符串等操作。 数据类型可分为两类:一类是非结构的原子类型,如C#语言的基本类型 (整型、实型、字符型等);另一类是结构类型,它的成分可以由多个结构类型 组成,并可以分解。结构类型的成分可以是非结构的,也可以是结构的。例如, C#语言数组的成分可以是整型等基本类型,也可以是数组等结构类型。 5、数据结构(Data Structure) 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。在任何问 题数据元素之间都不是孤立的,而是存在着一定的关系,这种关系称为结构 (Structure)。根据数据元素之间关系的不同特性,通常有4类基本数据结构: (1) 集合(Set):如图1.1(a)所示,该结构数据元素除了存在“同属于一个集 合”的关系外,不存在任何其它关系。 (2) 线性结构(Linear Structure):如图1.1(b)所示,该结构数据元素存在着一 对一的关系。 (3) 树形结构(Tree Structure):如图1.1(c)所示,该结构数据元素存在着一对 多的关系。 (4) 图状结构(Graphic Structure):如图1.1(d)所示,该结构数据元素存在着 多对多的关系。 (a) 集合 (b) 线性结构 (c) 树形结构 (d)图状结构 图 1.1 4 类基本数据结构关系图 由于集合的元素的关系极为松散,可用其它数据结构来表示,所以本书不 做专门介绍。关于集合的概念在1.3.1小节有介绍。 数据结构的形式化定义为: 数据结构(C#语言版) 1.1 数据结构3 数据结构(Data Structure)简记为DS,是一个二元组, DS = (D,R) 其:D是数据元素的有限集合, R是数据元素之间关系的有限集合。 下面通过例题来进一步理解后3类数据结构。 【例1-1】 学生信息表(如表1.1所示.)是一个线性的数据结构,表的每 一行是一个记录(在数据库信息处理系统,表的一个数据元素称为一个记 录)。一条记录由学号、姓名、行政班级、性别和出生年月等数据项组成。表 数据元素之间的关系是一对一的关系。 表 1.1 学生信息表 学号 姓名 行政班级 性别 出生年月 040303001 雷洪 软件04103 男 1986.12 040303002 李春 软件04103 女 1987.3 040303003 周刚 软件04103 男 1986.9 【例1-2】 家族关系是典型的树形结构,图1.2是一个三代的家族关系。在 图,爷爷、儿子、女儿、孙子、孙女或外孙女是一个结点(在树形结构,数 据元素称为结点),他们之间是一对多的关系。其,爷爷有两个儿子和一个女 儿,这是一对三的关系;一个儿子有两个儿子(爷爷的孙子),这是一对二的关 系;另一个儿子有一个儿子(爷爷的孙子)和一个女儿(爷爷的孙女),这是一 对二的关系;女儿有三个女儿(爷爷的外孙女),这是一对三的关系。树形结构 具有严格的层次关系,爷爷在树形结构的最上层,间层是儿子和女儿,最下层 是孙子、孙女和外孙女。不能把这种关系倒过来,因为绝对不会先有儿子或女儿 再有爷爷,也不会先有孙子或孙女再有儿子、先有外孙女再有女儿。 外孙女 爷爷 儿子 儿子 女儿 孙子 孙子 孙子 孙女 外孙女 外孙女 图 1.2 家族关系图 【例1-3】 图1.3是四个城市的公路交通图,这是一个典型的图状结构。在 图,每个城市是一个顶点(在图状结构数据元素称为顶点),它们之间是 多对多的关系。成都与都江堰、雅安直接通公路,都江堰与成都、青城山直接通 公路,青城山与都江堰、成都及雅安直接通公路,雅安与成都、青城山直接通公 路。这些公路构成了一个公路交通网,所以,又把图状结构称为网状结构(Network Structure) 数据结构(C#语言版) 1.2 算法4 成都 都江堰 青城山 雅安 图 1.3 四城市交通图 从数据类型和数据结构的概念可知,二者的关系非常密切。数据类型可以看 作是简单的数据结构。数据取值范围可以看作是数据元素的有限集合,而对数 据进行操作的集合可以看作是数据元素之间关系的集合数据结构包括数据的逻辑结构和物理结构。上述数据结构的定义就是数据的 逻辑结构(Logic Structure),数据的逻辑结构是从具体问题抽象出来的数学模型, 是为了讨论问题的方便,与数据在计算机的具体存储没有关系。然而,我们讨 论数据结构的目的是为了在计算机实现对它的操作,因此还需要研究在计算机 如何表示和存储数据结构,即数据的物理结构(Physical Structure)。数据的物理 结构又称为存储结构(Storage Structure),是数据在计算机的表示(又叫映像) 和存储,包括数据元素的表示和存储以及数据元素之间关系的表示和存储。 数据的存储结构包括顺序存储结构和链式存储结构两种。顺序存储结构 (Sequence Storage Structure)是通过数据元素在计算机存储器的相对位置来表 示出数据元素的逻辑关系,一般把逻辑上相邻的数据元素存储在物理位置相邻的 存储单元。在C#语言用数组来实现顺序存储结构。因为数组所分配的存储 空间是连续的,所以数组天生就具有实现数据顺序存储结构的能力。链式存储结 构(Linked Storage Structure)对逻辑上相邻的数据元素不要求其存储位置必须相 邻。链式存储结构数据元素称为结点(Node),在结点附设地址域(Address Domain)来存储与该结点相邻的结点的地址来实现结点间的逻辑关系。这个地址 称为引用(Reference),这个地址域称为引用域(Reference Domain)。 从20世纪60年代末到70年代初,出现了大型程序,软件也相对独立,人 们越来越重视数据结构,认为程序设计的实质是确定数据结构,加上设计一个好 的算法,这就是人们常说的“程序=数据结构+算法”。下一节谈谈算法的问题。 1.2 算法 从上节我们知道,算法与数据结构和程序的关系非常密切。进行程序设计时, 先确定相应的数据结构,然后再根据数据结构和问题的需要设计相应的算法。由 于篇幅所限,下面只从算法的特性、算法的评价标准和算法的时间复杂度等三个 方面进行介绍。 1.2.1 算法的特性 算法(Algorithm)是对某一特定类型的问题的求解步骤的一种描述,是指令的 有限序列。其的每条指令表示一个或多个操作。一个算法应该具备以下5个特 性: 1、有穷性(Finity):一个算法总是在执行有穷步之后结束,即算法的执行时间是 有限的。 2、确定性(Unambiguousness):算法的每一个步骤都必须有确切的含义,即无二 义,并且对于相同的输入只能有相同的输出。 3、输入(Input):一个算法具有零个或多个输入。它即是在算法开始之前给出的 数据结构(C#语言版) 1.2 算法5 量。这些输入是某数据结构数据对象。 4、 输出(Output):一个算法具有一个或多个输出,并且这些输出与输入之间存 在着某种特定的关系。 5、 能行性(realizability):算法的每一步都可以通过已经实现的基本运算的有 限次运行来实现。 算法的含义与程序非常相似,但二者有区别。一个程序不一定满足有穷性。 例如操作系统,只要整个系统不遭破坏,它将永远不会停止。还有,一个程序只 能用计算机语言来描述,也就是说,程序的指令必须是机器可执行的,而算法 不一定用计算机语言来描述,自然语言、框图、伪代码都可以描述算法。 在本书我们尽可能采用C#语言来描述和实现算法,使读者能够阅读或上 机执行,以便更好地理解算法。 1.2.2 算法的评价标准 对于一个特定的问题,采用的数据结构不同,其设计的算法一般也不同,即 使在同一种数据结构下,也可以采用不同的算法。那么,对于解决同一问题的不 同算法,选择哪一种算法比较合适,以及如何对现有的算法进行改进,从而设计 出更适合于数据结构的算法,这就是算法评价的问题。评价一个算法优劣的主要 标准如下: 1、正确性(Correctness)。算法的执行结果应当满足预先规定的功能和性能的要求, 这是评价一个算法的最重要也是最基本的标准。算法的正确性还包括对于输入、 输出处理的明确而无歧义的描述。 2、可读性(Readability)。算法主要是为了人阅读和交流,其次才是机器的执行。 所以,一个算法应当思路清晰、层次分明、简单明了、易读易懂。即使算法已转 变成机器可执行的程序,也需要考虑人能较好地阅读理解。同时,一个可读性强 的算法也有助于对算法隐藏错误的排除和算法的移植。 3、健壮性(Robustness)。一个算法应该具有很强的容错能力,当输入不合法的数 据时,算法应当能做适当的处理,使得不至于引起严重的后果。健壮性要求表明 算法要全面细致地考虑所有可能出现的边界情况和异常情况,并对这些边界情况 和异常情况做出妥善的处理,尽可能使算法没有意外的情况发生。 4、运行时间(Running Time)。运行时间是指算法在计算机上运行所花费的时间, 它等于算法每条语句执行时间的总和。对于同一个问题如果有多个算法可供选 择,应尽可能选择执行时间短的算法。一般来说,执行时间越短,性能越好。 5、占用空间(Storage Space)。占用空间是指算法在计算机上存储所占用的存储空 间,包括存储算法本身所占用的存储空间、算法的输入及输出数据所占用的存储 空间和算法在运行过程临时占用的存储空间。算法占用的存储空间是指算法执 行过程所需要的最大存储空间,对于一个问题如果有多个算法可供选择,应尽 可能选择存储量需求低的算法。实际上,算法的时间效率和空间效率经常是一对 矛盾,相互抵触。我们要根据问题的实际需要进行灵活的处理,有时需要牺牲空 间来换取时间,有时需要牺牲时间来换取空间。 通常把算法在运行过程临时占用的存储空间的大小叫算法的空间复杂度 (Space Complexity)。算法的空间复杂度比较容易计算,它主要包括局部变量所占 用的存储空间和系统为实现递归所使用的堆栈占用的存储空间。 如果算法是用计算机语言来描述的,还要看程序代码量的大小。对于同一个 问题,在用上面5条标准评价的结果相同的情况下,代码量越少越好。实际上, 代码量越大,占用的存储空间会越多,程序的运行时间也可能越长,出错的可能 数据结构(C#语言版) 1.2 算法6 性也越大,阅读起来也越麻烦。 在以上标准,本书主要考虑程序的运行时间,也考虑执行程序所占用的空 间。影响程序运行时间的因素很多,包括算法本身、输入的数据以及运行程序的 计算机系统等。计算机的性能由以下因素决定: 1、硬件条件。包括所使用的处理器的类型和速度(比如,使用双核处理器还是 单核处理器)、可使用的内存(缓存和RAM)以及可使用的外存等。 2、实现算法所使用的计算机语言。实现算法的语言级别越高,其执行效率相对 越低。 3、所使用的语言的编译器/解释器。一般而言,编译的执行效率高于解释,但解 释具有更大的灵活性。 4、所使用的操作系统软件。操作系统的功能主要是管理计算机系统的软件和硬 件资源,为计算机用户方便使用计算机提供一个接口。各种语言处理程序如编译 程序、解释程序等和应用程序都在操作系统的控制下运行。 1.2.3 算法的时间复杂度 一个算法的时间复杂度(Time Complexity)是指该算法的运行时间与问题规 模的对应关系。一个算法是由控制结构和原操作构成的,其执行的时间取决于二 者的综合效果。为了便于比较同一问题的不同算法,通常把算法基本操作重复 执行的次数(频度)作为算法的时间复杂度。算法的基本操作一般是指算法 最深层循环内的语句,因此,算法基本操作语句的频度是问题规模n的某个函 数f(n),记作:T(n)=O(f(n))。其“O”表示随问题规模n的增大,算法执行时 间的增长率和f(n)的增长率相同,或者说,用“O”符号表示数量级的概念。例 如,如 )1n(n 2 1 )n(T −= ,则 )1n(n 2 1 −的数量级与n2 相同,所以T(n)=O(n2 )。
java八股文是指面试常见的一些问题,类似于"八股文"的形式。以下是一个可能的Java八股文的示例(2023年): 1. 请介绍一下Java的基本数据类型。 Java的基本数据类型包括:byte、short、int、long、float、double、char、boolean。每种类型都有其对应的取值范围和默认值。 2. 请解释一下面向对象编程的概念。 面向对象编程是一种编程范式,它将程序设计问题分解为一组相互关联的对象,每个对象都有自己的状态和行为。通过封装、继承和多态等概念,面向对象编程可以提高代码的可重用性、可维护性和可扩展性。 3. 什么是Java的多态性? 多态性是指同一个方法名可以在不同对象上执行不同的操作。它通过继承和方法重写实现,可以提高代码的灵活性和可扩展性。 4. 请解释一下Java的异常处理机制。 在Java,异常是指在程序运行过程可能发生的错误或异常情况。异常处理机制允许程序员捕获并处理这些异常,以避免程序崩溃或产生不可预料的结果。常见的异常处理方式包括try-catch块、throw语句和finally块。 5. 请介绍一下Java的线程和线程同步。 线程是程序执行的独立单位,Java的线程可以实现并发编程。线程同步是指多个线程之间的协调与互斥,以保证共享资源的正确访问。Java提供了synchronized关键字和Lock接口等机制来实现线程同步。 6. 请解释一下Java的反射机制。 Java的反射机制允许程序在运行时动态地获取类的信息并操作类或对象。通过反射,可以在运行时创建对象、调用方法、获取字段等,提供了一种灵活且功能强大的编程方式。 7. 请介绍一下Java集合框架。 Java集合框架提供了一组接口和类,用于存储和操作对象集合。常见的集合类包括List、Set、Map等,它们提供了不同的数据结构和操作方式,可以满足不同场景下的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值