说是算法优化,基本上是在吹牛,仅仅只是算是记录下,我写代码时候的思路。毕竟还是小菜鸟。

我要开一个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怎么写。以后再研究吧。

内部元素一一相应的集合的算法优化,从list到hashmap的更多相关文章

  1. std::set 中内部元素有序条件删除的理解

    std::set 中内部元素有序条件删除的理解 1. std::set中的元素是有序排列的 注意:Set集合中的元素通过iterator的引用,但是不能修改. 元素排序: (1)元素中实现比较oper ...

  2. JS/jquery获取iframe内部元素和ifame中获取外部元素精华

    1.从外部获取iframe内部元素方法: js : window.frames['frame'].document.getElementById("imglist");   //f ...

  3. Canvas 内部元素添加事件处理

    目录 前言 自定义事件 有序数组 元素父类 事件判断 其他 立即执行函数 apply, call, bind addEventListener 传参 调用父类的构造函数 对象检测 isPointInP ...

  4. ScrollView内部元素如何做到fill_parent 或者 match_parent?

    转  : http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0704/1629.html ScrollView滚动视图是指当拥有很多 ...

  5. 【HTML5】Canvas 内部元素添加事件处理

    前言 canvas 没有提供为其内部元素添加事件监听的方法,因此如果要使 canvas 内的元素能够响应事件,需要自己动手实现.实现方法也很简单,首先获得鼠标在 canvas 上的坐标,计算当前坐标在 ...

  6. div内部元素居中

    要让div内部元素垂直居中,则给div加上此css样式: .div-vertical-middle{  height:200px;  width:304px;  line-height:50px;  ...

  7. ext.net gridlist选择内部元素时自动选择所在行

    function changeSelection(id) { var index = 0; for (var i = 0; i < mcp_liststore.data.length; i++) ...

  8. HTML5 canvas 内部元素事件响应

    HTML5 canvas 内部元素事件响应 isPointInPath 只能拿当前上下文的路径 重画每个部分 都isPointInPath判断

  9. 移动端 元素外面使用伪类after加边框 导致其内部元素无法选中

    解决方法:给内部元素增加属性 position: relative; z-index: 3; 这样就能选中其内部元素了.

随机推荐

  1. box-sizing 属性

    box-sizing属性可以为三个值: content-box,border和padding不计算入width之内 padding-box,padding计算入width内 border-box,bo ...

  2. jQuery实现大图轮播

    css样式: *{    margin: 0;    padding: 0;}ul{    list-style:none;}.slideShow{    width: 620px;    heigh ...

  3. Ubuntu 16.04 小飞机启动失败

    好长时间没用小飞机了,今天打开发现,无法启动了. 查看了日志: Initialising ciphers... AES-256/CFB (aes-256-cfb) initialised. Runni ...

  4. Android控件显示和隐藏

    Android控件都有visibility属性,该属性有三个可能值:visible.invisible.gone.可以通过预设或是Java程序控制这些控件的显示或隐藏. 一.在XML配置文件设置 可见 ...

  5. 机器学习之step by step实战及知识积累笔记

    数据工作者工作时间划分 据crowdflower数据科学研究报告,数据科学工作者的时间分配主要在以下几个领域: 首先是数据收集要占20%左右的时间和精力,接着就是数据清洗和再组织需要占用60%的时间. ...

  6. scrapy实战--爬取报刊名称及地址

    目标:爬取全国报刊名称及地址 链接:http://news.xinhuanet.com/zgjx/2007-09/13/content_6714741.htm 目的:练习scrapy爬取数据 学习过s ...

  7. phantomJs页面操作

    因为phantomjs能加载和操纵页面,它可以自动化地完美执行页面的各种操作. 操作文档: 脚本的被执行,就像它真的正在web 浏览器上运行一样. 下面的脚本,是读取元素id为myagent的文本内容 ...

  8. Oracle重启操作步骤

    有时候在服务中重启了oracle之后,数据库并不能正常访问,可以通过以下步骤: 在windows服务中启动数据库服务: 在windows命令窗口中输入命令:sqlplus /nolog 在sql> ...

  9. Linux系统优化实现高并发

    ulimit -SHn 65535内核优化net.ipv4.ip_forward = 1            #开启路由功能net.ipv4.conf.default.rp_filter = 1   ...

  10. spring4声明式事务—02 xml配置方式

    1.配置普通的 controller,service ,dao 的bean. <!-- 配置 dao ,service --> <bean id="bookShopDao& ...