说是算法优化,基本上是在吹牛,只不过算是记录下,我写代码时候的思路。毕竟还是小菜鸟。
我要开一个party,与会者都是情侣,但是情侣并不是一起过来的,而是有先有后,但是每位与会者来的时候都拿着一束鲜花,第一件事情就是送给自己的伴侣。
设计一个算法,最高效率的解决这个事情。
最开始的时候,是这样的。
import java.util.ArrayList; import java.util.List; public class TestParty { List<Person> persons = new ArrayList<Person>(); void onPersonArrived(Person A){ persons.add(A); String name = getGirlFriendName(); for(Person p:persons){ if(p.getName().equals(name)){ sendFlow(p); } } } private void sendFlow(Person p) { // TODO Auto-generated method stub } private String getGirlFriendName() { // TODO Auto-generated method stub return "小丽"; } }
相当于A来了以后,挨个问所有到场的人的名字,看看跟自己的女朋友名字一样不一样,如果一样,就把花送给他。
但是很明显,挨个问是非常没有效率的事情。
所以应该用hashmap,所以代码变成这样。
import java.util.HashMap; import java.util.Map; public class TestHashMapParty { private Map<String,Person> persons = new HashMap<String,Person>(); void onPersonArrived(Person A){ persons.put(getPositionByName(A.getName()), A); String name = getGirlFriendName(); Person B = persons.get(getPositionByName(name)); if(B != null){ sendFlow(B); } } private void sendFlow(Person b) { // TODO Auto-generated method stub } private String getGirlFriendName() { // TODO Auto-generated method stub return null; } private String getPositionByName(String name) { // TODO Auto-generated method stub return null; } }
这次我们的party组织的更好了,每个人来了之后,会从组织者那里根据自己名字拿到自己安排的座位,然后坐上去,同时,还可以根据女朋友的名字拿到女朋友的座位,然后直接走过去,把花送给她。
故事到这里讲完了吗?对于一个人来说,故事已经结束了,但是对于代码来说,还没有。
代码里有一个方法叫
private String getPositionByName(String name) { // TODO Auto-generated method stub return null; }
我在这里没有实现,但是如果具体实现的话,应该是某种算法,或者数据库记录。因为java对象所有的记忆功能都是我们代码赋予的。如果我们没有赋予它记住自己女朋友的功能,那么每次给女朋友送花的时候,都需要调用一次这个方法,事实上也是低效的。
于是贴出最终的代码。Person.java
public class Person { private String name; private String position; private String girlFriendPosition; String getName(){ return name; } public String getPosition() { return position; } public void setPosition(String position) { this.position = position; } public String getGirlFriendPosition() { return girlFriendPosition; } public void setGirlFriendPosition(String girlFriendPosition) { this.girlFriendPosition = girlFriendPosition; } public void setName(String name) { this.name = name; } }
TestHashMap.java
import java.util.HashMap; import java.util.Map; public class TestHashMapParty { private Map<String,Person> persons = new HashMap<String,Person>(); void onPersonArrived(Person A){ String position = getPositionByName(A.getName()); persons.put(position, A); A.setPosition(position); A.setGirlFriendPosition(getPositionByName(getGirlFriendName())); Person B = persons.get(A.getGirlFriendPosition()); if(B != null){ sendFlow(B); } } private void sendFlow(Person b) { // TODO Auto-generated method stub } private String getGirlFriendName() { // TODO Auto-generated method stub return null; } private String getPositionByName(String name) { // TODO Auto-generated method stub return null; } }
我们给了Person两个成员变量,专门用来记住自己的位置和女朋友的位置。这样效率应该是最高了。但是比较繁琐。
终极优化应该是。
MyMap = new MyMap(); B = map.get(A); A = map.get(B);
现在的HashMap是没办法处理null 的,因为A和B不是同时来,所以现在的HashMap如果想用A做B的key,B做A的key会遇到NULL问题。
至于MyMap怎么写。以后再研究吧。
相关推荐
liballoc 中的 hashmap 默认使用 SipHash,它并没有我们想要的那么快。在编译器中,我们并不真正担心 DOS 尝试,因此我们使用快速非加密哈希。 这与 Firefox 使用的算法相同——它是一种不基于任何广为人知的算法的...
当一个键值对被添加到HashMap中时,键的哈希码(hashCode)被计算出来,这个哈希码用于确定键值对在内部数组中的位置。如果两个键的哈希码相同,HashMap会使用equals()方法来区分它们,这就是所谓的哈希碰撞。为了...
list 转化成hashmap例子 java程序
本文主要探讨了几个关键的集合接口和实现类的底层源码,包括List、HashMap、HashSet等,以及它们的基本操作。 首先,Collection接口是所有单值集合的父接口,提供了增加、删除、遍历元素的基本方法。例如,`add()`...
在Java编程语言中,集合框架是处理对象数组的重要工具,其中`List`、`ArrayList`、`Vector`、`HashTable`和`HashMap`是五个关键的接口和类,它们各有不同的特性和用途。以下是这些概念的详细解释: 1. **List接口**...
putVal 方法首先计算 key 的 hash 值,然后找到对应的下标,最后将元素插入到红黑树中。如果某一个下标位置的元素个数大于等于 8 时,就会树化,树化首先将链表中的每个 Node 节点转为 TreeNode 节点,然后重新用 ...
HashMap和List遍历方法及如何遍历删除元素总结 HashMap和List都是Java中最常用的数据结构,它们都可以用来存储和操作数据。然而,在遍历和删除元素时,需要小心地处理,以免出现问题。下面总结了HashMap和List的...
这些问题通常属于组合优化或图论领域,涉及到路径搜索算法,如深度优先搜索(DFS)、广度优先搜索(BFS)以及A*算法。解决拼图问题通常需要寻找一种有效的方法来评估状态空间并确定下一个移动的方向。 这四个主题...
在Java编程语言中,集合框架是开发者日常工作中不可或缺的一部分,HashMap作为其中的重要成员,它的实现原理对于理解Java性能优化和数据结构有深远的意义。HashMap是一个基于哈希表的数据结构,它实现了Map接口,...
- **合并**:`addAll()`可以将一个集合的元素添加到另一个集合中。 - **过滤**:Java 8引入的流API允许使用`filter()`进行条件过滤。 - **映射**:使用`map()`对集合中的每个元素应用函数。 - **并集、交集、...
HashMap作为Java集合框架中的重要成员,是面试中常见的知识点,尤其在数据结构与算法、并发编程以及JVM内存管理等领域,HashMap的深入理解至关重要。本篇将围绕HashMap的相关面试题,从基础概念到高级应用进行详尽...
HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,这样可以保证能快速存、取集合元素;对于 HashMap 而言,系统 key-value 当成一个整体进行处理,系统总是...
Delphi的HashMap集合是一种高效的数据结构,用于存储键值对,它通过哈希函数实现快速查找,这使得在大量数据中查找特定元素的时间复杂度接近O(1)。HashMap在Delphi的不同版本中都有支持,包括Delphi 5、Delphi 6、...
HASHMap迭代集合的例子好用,逻辑算法
为了提高查找效率,HashMap需要一个良好的哈希算法来计算元素的存储位置。理想情况下,每个位置的链表长度为1,即元素直接命中,无需遍历链表。 **2.1 哈希函数** Java中HashMap使用的哈希函数是基于键的哈希码...
然而,HashMap本身并不保证元素的顺序,特别是当涉及到遍历或输出HashMap的内容时,顺序可能会不确定,因为它是基于哈希算法实现的。在某些场景下,我们可能需要对HashMap进行排序,例如按照key的值或key的自然顺序...
HashMap是一种基于哈希表的集合类,它的存储结构是一个数组,每个元素是一个单链表的头节点,链表用来解决hash地址冲突问题。HashMap有四个构造方法,其中初始容量和加载因子是影响性能的重要参数。加载因子是哈希表...
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了数据结构和算法的实现,使得在处理对象集合时更加高效和灵活。集合框架包括接口、类和算法,这些都集中在`java.util`包中。主要的集合接口有List、Set...
关于源码,Java集合框架的实现类通常包含了许多内部细节,比如数据结构的优化、线程安全的考虑等。例如,`ArrayList`底层使用的是动态增长的数组,而`LinkedList`则由双向链表构成,它们在插入和删除操作上的性能...
List、ArrayList、Vector及map、HashTable、HashMap分别的区别 List、ArrayList、Vector及map、HashTable、HashMap是Java容器类中的几个重要的接口和实现类,了解它们之间的区别是非常重要的。 首先,我们来看List...