1 |
|
链表结构实现
最近清理磁盘,发现以前自己的一些学习痕迹,当时留下的汇编代码现在看反而自己有点懵,所以,学习的一些心得是,不是你到底学了多少,一定是记住了多少,想想以前花了大量时间研究学习的都忘记,心里很不是滋味。为了不让它消失,也算对自己学习的一些回报就把它收录了进来,供大家参考。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
void inversion(int *p);//逆序
void sersion(int *p,int len);//冒泡排序
typedef struct List //list模型
{
int data;
struct List *next;
}*PNODE,NODE;
// 创建列表
PNODE create_list();
//遍历
void traverse_list(PNODE phead);
//判断是否为空
bool is_empty(PNODE phead);
//长度or是否饱和
int length_list(PNODE);
//插入
bool insert_list(PNODE, int, int);
//删除
bool delete_list(PNODE, int, int*);
//排序
void sort_list(PNODE);
tcp
tcp
1 | import socket |
服务端
1 | # 绑定IP地址和端口 |
建立连接
tcp的三次握手
http://img3.imgtn.bdimg.com/it/u=877665853,860765078&fm=214&gp=0.jpg
客户端发送一个带SYN标志的TCP报文到服务器。SYN位表示连接请求。序号是1000(随机数,此处1000),这个序号在网络通讯中用作临时的地址,每发一个数据字节,这个序号要加1,这样在接收端可以根据序号排出数据包的正确顺序,也可以发现丢包的情况。mss表示最大段尺寸,如果一个段太大,封装成帧后超过了链路层的最大帧长度,就必须在IP层分片,为了避免这种情况,客户端声明自己的最大段尺寸,建议服务器端发来的段不要超过这个长度。
服务器端回应客户端,同时带ACK标志和SYN标志。它表示对刚才客户端SYN的回应;同时又发送SYN给客户端,询问客户端是否准备好进行数据通讯。服务器发出段2,也带有SYN位,同时置ACK位表示确认,确认序号是1001,表示“我接收到序号1000及其以前所有的段,请你下次发送序号为1001的段”,也就是应答了客户端的连接请求,同时也给客户端发出一个连接请求SYN,序号是8000(实际也是一个随机数,此处以8000为例),同时声明最大尺寸为1024。
- 客户端对服务器的连接请求进行应答,确认ack序号是8001
- 在建立连接的同时,双方协商了一些信息,例如双方发送序号的初始值、最大段尺寸等.在TCP通讯中,如果一方收到另一方发来的段,读出其中的目的端口号,发现本机并没有任何进程使用这个端口,就会应答一个包含RST位的段给另一方。例如,服务器并没有任何进程使用8080端口,我们却用telnet客户端去连接它,服务器收到客户端发来的SYN段就会应答一个RST段,客户端的telnet程序收到RST段后报告错误Connection refused。
Selenium+PhantomJS
Selenium是一个Web的自动化测试工具1
pip install selenium
PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript
< PhantomJS 是一个功能完善(虽然无界面)的浏览器而非一个 Python 库,所以它不需要像 Python 的其他库一样安装,但我们可以通过Selenium调用PhantomJS来直接使用 >1
2
3
4
5
6
7
8
9
10
11# WebDriver 有点儿像可以加载网站的浏览器
from selenium import webdriver
# 调用环境变量指定的PhantomJS浏览器创建浏览器对象
driver = webdriver.PhantomJS()
# get方法会一直等到页面被完全加载
driver.get(url)
<!----------more----------->
#查看页面快照
driver.save_screenshot("abc.png")
driver.quit()
元素的选取
find_element_by_id()
1 | for example: |
find_elements_by_name()
1 | for example: |
find_elements_by_xpath()
1 | for example: |
find_elements_by_link_text()
1 | for example: |
find_elements_by_partial_link_text()
1 | for example: |
find_elements_by_tag_name()
1 | for example: |
find_elements_by_class_name()
1 | for example: |
find_elements_by_css_selector()
1 | for example: |
鼠标动作链
1 | #导入 ActionChains 类 |
下拉框
1 | # 导入 Select 类 |
页面切换
1 | driver.switch_to.window("this is window name").click() |
页面前进和后退
1 | driver.forward() #前进 |
执行js
1 | driver.execute_script(js) |
隐式等待
1 | from selenium import webdriver |
显示等待
1 | title_is |
常见排序算法
常见时间复杂度之间的关系
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)
排序算法的稳定性
稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。
冒泡排序
冒泡排序算法的运作如下:
- 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1
2
3
4
5
6def bubble_sort(alist):
for j in range(len(alist)-1,0,-1):
# j表示每次遍历需要比较的次数,是逐渐减小的
for i in range(j):
if alist[i] > alist[i+1]:
alist[i], alist[i+1] = alist[i+1], alist[i]
时间复杂度
- 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
- 最坏时间复杂度:O(n2)
- 稳定性:稳定
响应码
1xx:信息
100 Continue
服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。
101 Switching Protocols
服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。
2xx:成功
200 OK
请求成功(其后是对GET和POST请求的应答文档
)
201 Created
请求被创建完成,同时新的资源被创建。
202 Accepted
供处理的请求已被接受,但是处理未完成。
203 Non-authoritative Information
文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。