- 浏览: 325999 次
- 性别:
- 来自: 西宁
文章分类
- 全部博客 (120)
- Java Thought (29)
- Java Pattern (4)
- Data Base (7)
- Algorithm Design (33)
- Linux (0)
- Mysql (2)
- Oracle (0)
- ConstructionDesign-架构 (5)
- Spring Platform (0)
- Tomcat (1)
- JavaScript (7)
- Web System (3)
- MS SQLServer (1)
- 软件哲学 (6)
- View (3)
- Java GUI (4)
- CSSDIV (7)
- CloudComputing (0)
- WebService (0)
- SystemOrProject (2)
- SOA (0)
- 互转共享 (3)
- 偶尔java习题 (0)
- Thinks with does (1)
最新评论
-
sassds:
佩服啊 高手
分享一款js特效 -
bhjackson:
学习啦,能否详细介绍下回溯的过程?O(∩_∩)O谢谢
分享回溯法- 找n个数中r个数的组合 -
zk7019311:
了解了解。。。。。
业务层代码复用的一点建议 -
lijie1819:
看到LZ的设计思想,感觉和抽象工厂模式有点相像。
业务层代码复用的一点建议 -
wjjcml1982:
酷毙了!楼主太强悍了!
分享一款js特效
1. 散列
散列有两种形式。一种是开散列(或外部散列),它将字典元素存放在一个潜无穷的空间里,因此它能处理任意大小的集合。
另一种是闭散列(或内部散列), 它使用一个固定大小的存储空间,因此它能处理的集合的大小不能超过它的存储空间的大小。
2. 开散列
(1)下图是一个开散列表,它表示了开散列的基本数据结构。
(2) 基本思想
开散列的基本思想是将集合的元素(可能有无穷多个)划分成有穷多个类。例如,划分为0、1、2、....、B-1这B个类。用散列函数h将集合中的每个元素x映射到0、1、2、....、B-1之一,h(x)的值就是x所属的类。h(x)称为x的散列值。上面所说的每一个类称为一个桶,并且称x属于桶h(x).
我们用一个链接表表示一个桶。x是将第i个链接表中的元素当且仅当h(x)=i,即x属于第i个桶。B个桶(链接表)的桶(表)头存放于桶(表)头数组中。
用散列表来存储集合中的元素时,总希望将集合中的元素均匀地散列到每一个桶中,使得当集合中含有n个元素时,每个桶中平均有n/B个元素。如果我们能估计出n,并选择B与n差不多大小时,则每个桶中平均只有一两个元素。这样,字典的每个运算所需要的平均时间就是一个与n和B无关的小常数。由此可以看出,开散列表是将数组和链接表结合在一起的一种数据结构,并希望能利用它们各自的优点且克服它们各自的缺点。因此,如何选择随机的散列函数,使它能将集合中的元素均匀地散列到各个桶中是散列技术的一个关键。
(3) 求余运算。
如果x是不是数值型,将字符串x中的每个字符转换成一个整数,然后将字符串每个字符所对应的整数相加,用和除以B的余数作为h(x)的值,显然这个余数是0、1、2、....、B-1之一。
3. 模拟代码:
--------------
呵呵 算法是计算机科学的灵魂 基础更为重要
你能给出闭散列的代码吗?在30分钟内
散列有两种形式。一种是开散列(或外部散列),它将字典元素存放在一个潜无穷的空间里,因此它能处理任意大小的集合。
另一种是闭散列(或内部散列), 它使用一个固定大小的存储空间,因此它能处理的集合的大小不能超过它的存储空间的大小。
2. 开散列
(1)下图是一个开散列表,它表示了开散列的基本数据结构。
(2) 基本思想
开散列的基本思想是将集合的元素(可能有无穷多个)划分成有穷多个类。例如,划分为0、1、2、....、B-1这B个类。用散列函数h将集合中的每个元素x映射到0、1、2、....、B-1之一,h(x)的值就是x所属的类。h(x)称为x的散列值。上面所说的每一个类称为一个桶,并且称x属于桶h(x).
我们用一个链接表表示一个桶。x是将第i个链接表中的元素当且仅当h(x)=i,即x属于第i个桶。B个桶(链接表)的桶(表)头存放于桶(表)头数组中。
用散列表来存储集合中的元素时,总希望将集合中的元素均匀地散列到每一个桶中,使得当集合中含有n个元素时,每个桶中平均有n/B个元素。如果我们能估计出n,并选择B与n差不多大小时,则每个桶中平均只有一两个元素。这样,字典的每个运算所需要的平均时间就是一个与n和B无关的小常数。由此可以看出,开散列表是将数组和链接表结合在一起的一种数据结构,并希望能利用它们各自的优点且克服它们各自的缺点。因此,如何选择随机的散列函数,使它能将集合中的元素均匀地散列到各个桶中是散列技术的一个关键。
(3) 求余运算。
如果x是不是数值型,将字符串x中的每个字符转换成一个整数,然后将字符串每个字符所对应的整数相加,用和除以B的余数作为h(x)的值,显然这个余数是0、1、2、....、B-1之一。
3. 模拟代码:
package boke.dictionary; /** * 开散列的简单模拟(一): 桶元素 * * @since jdk1.6 * @author 毛正吉 * @version 1.0 * @date 2010.05.25 * */ public class Node { public int iData; public Node next; public Node(int i) { iData = i; } } ----------------------------------------------- package boke.dictionary; /** * 开散列的简单模拟(一): 作为简单模拟,元素选取整型 * * @since jdk1.6 * @author 毛正吉 * @version 1.0 * @date 2010.05.25 * */ public class Hash { /** * @param args */ public static void main(String[] args) { Hash hh = new Hash(1000); for (int i = 0; i <= 100; i++) { hh.insert(i); } System.out.println(hh.find(10)); System.out.println(hh.find(50)); System.out.println(hh.find(90)); System.out.println(hh.find(1000)); hh.insert(1000); System.out.println(hh.find(1000)); hh.delete(10); System.out.println(hh.find(10)); hh.insert(0); System.out.println(hh.find(0)); } private Node[] bucket; // 桶 private int maxSize; // 桶的个数 /** * 构造方法 * * @param maxSize */ public Hash(int maxSize) { this.maxSize = maxSize; bucket = new Node[maxSize]; makeNULL(); } /** * 字典初始化 */ public void makeNULL() { for (int i = 0; i < maxSize - 1; i++) { bucket[i] = null; } } /** * 查找x是否在字典中 * * @param x * @return */ public boolean find(int x) { int mod = x % maxSize; Node current = bucket[mod]; while (current != null) { if (current.iData == x) { return true; } else { current = current.next; } } return false; } /** * 插入x到hash字典中 * * @param x */ public void insert(int x) { if (!find(x)) { Node node = new Node(x); int mod = x % maxSize; Node old = bucket[mod]; bucket[mod] = node; bucket[mod].next = old; } else { System.out.println("该值已存在,不能重复插入!"); } } /** * 从hash字典中删除x * * @param x */ public void delete(int x) { int mod = x % maxSize; if (bucket[mod] != null) { if (bucket[mod].iData == x) { bucket[mod] = bucket[mod].next; } else { Node current = bucket[mod]; while (current.next != null) { if (current.next.iData == x) { current.next = current.next.next; } else { current = current.next; } } } } } }
评论
4 楼
maozj
2010-06-28
wese345 写道
大学时,数据结构对我来所简直是噩梦啊,呵呵
--------------
呵呵 算法是计算机科学的灵魂 基础更为重要
3 楼
wese345
2010-06-28
大学时,数据结构对我来所简直是噩梦啊,呵呵
2 楼
maozj
2010-06-28
mccxj 写道
最基本的数据结构,没看到什么亮点
你能给出闭散列的代码吗?在30分钟内
1 楼
mccxj
2010-06-28
最基本的数据结构,没看到什么亮点
发表评论
-
递归和动态规划构造两个字符序列的最长公共字符子序列
2010-06-28 08:28 4499应je朋友要求,所以翻开以前的算法题目,整理了以下,给 ... -
最大公约数的应用 - 分享
2010-06-25 08:08 18591.先看一家大公司笔试题 数组中有n个数据,要将它们顺 ... -
信息数字化解逻辑题分享
2010-06-21 08:09 12631. 前提条件: 将逻辑题目中的信息用数字化描述。 ... -
递归算法分析-分享
2010-06-19 16:09 16101. 深入认识递归 (1) 递 ... -
非递归算法分析实例分享
2010-06-18 15:47 10581 仅仅依赖于问题规模的时间复杂度 (1) 例1: 交换i和 ... -
NP完全性问题
2010-06-18 14:02 7026在学习算法设计与分析时,经常会提到NP完全性问题,到底 ... -
算法分析精述分享
2010-06-18 12:03 8811. 算法分析的评价体系 评价算法的三条主要标准是: ... -
贪婪策略算法的总结分享
2010-06-11 08:30 61011. 贪婪算法描述 贪婪算法又叫登山法,它的根本思想是 ... -
带权有向图 - 边上权值非负情形的单源最短路径问题
2010-06-07 08:57 26901. 问题描述: 给定 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)四
2010-06-07 08:54 137421. 工作分配问题。 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)三
2010-06-07 08:53 110517. 字符统计问题。 编写一个算法,统计在一个输入 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)二
2010-06-07 08:47 13818. 数字迷问题。 A B C ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)一
2010-06-07 08:38 11851. 线程问题。 设计4个线程,其中两个线程每次对j增加 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)
2010-06-07 08:37 18941. 线程问题。 设计 ... -
Java快速排序算法整理(二)
2010-05-31 14:04 1034package boke.sort; /** * 快 ... -
Java快速排序算法整理(一)
2010-05-31 13:39 662package boke.sort; /** * 快 ... -
Java最小堆实现
2010-05-31 08:29 58621.堆结点 package boke.heap1; /* ... -
Java插入排序代码整理
2010-05-28 14:44 1261package boke.sort; /** * 插 ... -
Java选择排序代码整理
2010-05-28 14:37 1517package boke.sort; /** * 选 ... -
Java冒泡排序代码整理
2010-05-28 14:26 1982Java冒泡排序代码整理: package boke.sor ...
相关推荐
4. **散列与查找**:散列是一种快速查找技术,通过散列函数将关键字映射到数组中。冲突解决方法如开放寻址法和链地址法也是重要知识点。 5. **排序算法**:包括冒泡排序、选择排序、插入排序、快速排序、归并排序、...
在本项目中,开发者使用Java语言实现了一个人工模拟的QQ应用程序,主要目的是为了学习和实践。这个图形化界面版的模拟QQ具备了基础的登录、注册和聊天功能,虽然它是一个单机版,但仍然提供了丰富的学习素材。下面将...
线性开型寻址是一种哈希表的冲突解决方法,主要应用于数据存储和查找的高效实现。在数据结构课程中,这种技术是重要的学习内容,因为它可以提高数据存取的速度,尤其是在处理大量数据时。本软件是山东大学数据结构...
1,散列星空:不同大小的星体被中心黑洞吸引,形成一个小型的星系。在此过程中会出现双星、聚星、星团等现象。黄道视角定位在随机星体上。 2,太阳系(可操控):模拟太阳系六大行星(只到土星轨道)和众多小行星的...
- **指令地址流**:实验要求生成一个混合的指令地址流,包含50%的顺序执行、25%的前部散列和25%的后部散列,以模拟不同执行模式下的页面访问。 2. 固定式分区分配的存储管理: 在固定式分区分配中,内存被预先划分...
二叉树是最简单的一种,每个节点最多有两个子节点。AVL树和红黑树是自平衡的二叉搜索树,确保了查找、插入和删除操作的时间复杂度为O(logn)。堆是一种特殊的树形结构,通常用于实现优先队列。Trie字典树常用于字符串...
根据给定的“数据结构模拟题”及其描述与部分题目内容,我们可以提炼出以下几个重要的知识点: ### 数据结构基础知识 #### 栈与队列的特点 - **栈**:遵循后进先出(LIFO, Last In First Out)的原则,即最后一个...
本文档主要介绍了一个简易版的RSA数字签名算法的模拟实现过程,用于加密和验证文件内容。 首先,RSA算法的核心在于两个大素数p和q的乘积n,以及与n相关的欧拉函数φ(n)。通过计算p和q的欧拉函数,可以得到模逆元e和...
全国计算机等级考试四级模拟试题主要涵盖计算机硬件、软件、数据结构、算法以及操作系统等多个方面的知识。以下是根据题目内容解析的一些重要知识点: 1. **程序计数器**:在计算机体系结构中,程序计数器(PC)是...
### 数据结构模拟试卷知识点解析 #### 一、单项选择题解析 **1.1 题目:** 以下数据结构中哪一个是线性结构? - **选项:** A.有向图 B.队列 C.线索二叉树 D.B树 - **答案:** B.队列 - **解析:** 在数据结构中,...
ATM(Automated Teller Machine)模拟程序是一个常见的Java编程练习,它可以帮助学习者掌握面向对象编程、控制流、异常处理、数据存储等关键概念。在这个项目中,我们将深入探讨如何构建一个简单的ATM系统,它包括...
**解析:** 链表的主要优点在于插入和删除操作简单,无需移动大量元素。因此,如果经常需要进行插入和删除操作,链表是一个很好的选择。选项B正确。 **4. 一个栈的输入序列为123,则下列序列中不可能是栈的输出序列...
本次实验旨在通过实践操作加深学生对于文件系统原理的理解,以及如何利用高级编程语言来模拟实现一个简易的文件管理系统。通过这一过程,可以帮助学生更好地掌握文件管理的核心概念,如文件的逻辑结构、存储结构及其...
在模块化设计方面,考生需要掌握如何将一个复杂问题分解为若干个简单的子问题,并将每个子问题的解法设计成独立的模块。这不仅要求程序设计要遵循模块化原则,而且各个模块之间需要有良好的接口设计,以保证模块间的...
开散列通过在冲突位置建立链表来解决问题,而闭散列则通过移动到哈希表的下一个位置。Rabin-Karp算法是Hash算法在字符串处理中的一个典型应用,它利用了字符串和k进制数的对应关系来实现快速字符串匹配。Rabin-Karp...
哈希表**:哈希表是一种使用散列函数来定位元素存储位置的数据结构,能够实现快速查找、插入和删除等操作。与存储结构有关。 - **C.线索树**:线索树是对二叉树的一种特殊处理方式,通过将空指针指向特定的节点,...
18. 数据结构特性:栈是先进后出(FILO),二叉树的第i层最多有2^(i-1)个节点,深度为k的完全二叉树最多有2^k - 1个节点,线性结构和链式结构各有优缺点,不能简单比较。 19. 快速排序趟数:对于给定序列,快速排序...
开放寻址法是减少冲突的一种方法,而直接取模是最简单的散列函数构造方法。 7. 线性表的存储结构:线性表可以使用数组、链表或者双向链表来实现。 二、回答问题部分涉及了树的性质、栈的操作、数据结构与抽象数据...