socket+常见算法+常见数据结构

```````````````````````````````````````````````````````````````````````````````

 

socket:
  1.网络七层由下往上:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
  2.ip协议--网络层 tcp协议--传输层 http协议(基于tcp链接)--应用层
  3.tcp/ip是传输层协议,解决数据如何在网络中传输;而http是解决如何包装数据.

  4.socket主要有两种传输方式:面向连接(tcp,安全性高,效率低) 和 无连接(udp? 安全性不高,效率高)

  5.套接字连接过程三个步骤:服务器监听,客户端请求,连接确认。

  6.socket的代码实现:

Socket 客户端
要想使用Socket来与一个服务器通信,就必须先在客户端创建一个Socket,并指出需要连接的服务器端的IP地址和端口,代码如下:
Socket socket = new Socket("192.168.1.110",33221);//"192.168.1.110"是IP地址,33221是端口号
ServerSocket 服务器端
创建一个服务器端的代码:
ServerSocket server = null;
server = new ServerSocket(33221);//服务器端在33221端口号监听客户请求,在这里服务器端只能接收一个请求,接收后服务器端就退出了。实际的应用中总是让他不
停地循环接收,一旦有客户请求,服务器端总是会创建一个服务器线程来服务新来的客户,而自己则继续监听。
Socket socket = server.accpet();//accpet()为一个阻塞函数,即该方法被调用后将等待客户的请求,直到有一个客户启动并请求连接到相同的端口,然后accept
返回一个对应于客户端的Socket.这时,客户方和服务方都建立了用于通信的Socket,接下来就由各个Socket分别打开各自的输入
输出流。

输入、输出流
Socket 提供了getInputStream()和getOutPutStream()来得到对应的输入(输出)流以进行读(写)操作,这两个方法分别返回InputStream和OutputStream类对象。
为了便于读(写)数据,可以在返回输入、输出流对象上建立过滤流。如:DataInputStream、DataOutPutStream、或PrintStream类对象。对于文本方式流对象,可以采用
InputStreamReader和OutputStreamWriter、PrintWirter处理 代码如下:
PrintStream os = new PrintStream(new BufferedOutputStream(Socket.getOutputStream()));
DataInputStream is = new DataInputStream(socket.getInputStream());
PrintWriter out = new PrintWriter(socket.getOutStream(),true);
BufferedReader in = new ButfferedReader(new InputStreamReader(Socket.getInputStream()));
关闭Socket和流
在Socket使用完毕后需要将其关闭,以释放资源。
注意:在关闭Socket之前,应将与Socket相关的所有的输入、输出流先关闭,以释放资源。要注意关闭的顺序。
os.close();//输出流先关闭
is.close();//输入流其次
socket.close();//最后关闭Socket


 算法:

1.分治法:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,各个击破.
  特征:①问题规模缩小到一定程度可以容易解决
    ②分解成若干规模较小的相同问题
    ③子问题的解可以合并为问题的解(关键)
    ④各个子问题是相互独立的
2.动态规划算法:

  条件:①满足最优化原理(每一个子策略对于它的初态和终态都是最优的)

     ②满足无后效性(当前状态与前后的没有关系)
  步骤:初始状态→│决策1│→│决策2│→…→│决策n│→结束状态(是最优路线)
  ①划分阶段(按照时间/空间)
  ②确定状态和变量(将问题发展到各个阶段的不同状态表示出来。状态的选择要满足无后效性)
  ③确定决策并写出状态转移方程
  ④寻找边界条件:状态转移方程是一个递推式,需要一个递推终止的边界条件
  三要素:问题的阶段/阶段的状态/阶段转化间的递推关系
3贪心算法:对问题求解时,总是做出在当前看来是最好的选择.
  思路:①简历数学模型来描述问题
    ②把问题分成若干个子问题
    ③对每一个子问题求最优解
    ④把子问题的解合成原来问题的解
  值得注意的是:贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法,可以依赖先前做出的选择,但不能一来后来的选择。
贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。可惜的是,它需要证明后才能真正运用到题目的算法中。
4.回溯法:是一种选优搜索法,按选优条件向前搜索以达到目标.如果探索到某一步发现前面的选择不忧或达不到目标,就回退一步重新选择.(例子:走迷宫)
  步骤:①针对所给的问题,定义问题的解空间
  ②确容易搜索的解空间结构
  ③搜索解空间,在搜索过程中用剪枝函数避免无效搜索
5.穷举法:列出问题的所以可能解,逐一进行判别,找出满足条件的解.
  关键:如何列出所有的可能解
  如何判断可能解是否满足条件


 

数据结构:数据元素相互之间的关系成为结构.
  四种基本结构:集合,线性,树形,图形
集合:
线性:元素之间一对一,如数组,链表,队列,栈
树形:一对多关系,如二叉树,查找树
图形:多对多关系,
特点
数组:长度不可变,直接算出内粗地址去读,所以通过索引访问效率很高
列表(List):数组的延伸,长度可变
  |--ArrayList 通过index访问效率高,但中间插入数据效率低(需要把插入点后的数据都往后挪)
  |--LinkedList 中间插入数据效率高(只改变指针指向),索引访问没有ArrayList快.
集合(Set):其中的数据都是唯一的,不保证元素的顺序
  LinkedHashSet 有序,查询快,元素去重
袋子(Bag):和Set类似,不一样的是: 袋子里面对每个key计数,所以如果同一个key被加入多次那么可以通过接口获取这个key在这个袋子里面的个数
树(Tree):
  堆(heap):任意一个节点的值都比它的子节点大
  二叉搜索树(binary search tree):树的左边的所有key值都比根节点的key值小,右边的所以key值都比根节点的key值大.从左向右遍历就可以得到一个有序序列.
  Merkle Tree(Hash Tree)
merkle tree主要用在对数据的校验上,对于一个很大的文件在两个机器之间进行传输的时候, 会这个文件切成很多的小块,然后对每一块计算hash值然后再把这些hash组成一个tree结构: 这个tree里面的每个叶节点对应具体的文件块的hash, 而非叶节点的值则是它子节点的hash的hash, 这样传输好了之后计算hash tree, 把这个hash tree和之前传输过来的hash tree进行对比就可以在logN的比较次数内找到那些数据有问题
  B-/B+ Tree
B-树是二叉搜索树的一种泛化 — m叉搜索树, 每个节点可以有多于两个子节点。B-/B+树多用在数据库/文件系统的设计中, 树中存储的数据实际是实际数据的一级索引,二级索引,三级索引, 这样可以保证在确定的时间内查找到一个具体的数据 – 具体时间取决于每个节点上的数据量以及索引的层数。
  红黑树
红黑树是一种特殊的二叉搜索树, 它在插入,删除数据的时候自动调整树结构,保证树结构的平衡。 它比AVL树对于平衡的要求弱一点,所以在插入数据的时候比AVL树要快, 在查询数据的时候比AVL可能要稍微慢一点。 TreeMap就是利用红黑树来存储数据的.

2014-01-06 夜

转载于:https://www.cnblogs.com/ff0o0/p/3508056.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值