要做怎么做一家贷款中介公司的家,要22做33的02家23数74字扣扣,连起来!是夏款到账收钱!

##整理学数据结构的一些笔记(二)

? ADT:抽象数据类型一些操作的集合。模块化设计的扩充

1.一般形式:A1,A2,A3…,An,大小为n.n=0时,称为空表An前后分别为An的前驱和后继。

2.链表(List):每一個结构均含有表元素和指向包含该元素后继元的结构的指针线性时间,效率更高

删除指令:使指针指向下下个元素。

插入指令:需要使用一次malloc调用从新单元并在此后执行两次指针调整

(在C中表和Position以及函数的原型都列在所谓的.h头文件中。具体(Node)节点声明则在.c文件中)

/*返回链表中元素X的位置*/ /*删除链表中的元素X*/ /*通过中间变量进行交换达到插入的作用*/

原因:有指针变量包含了伪地址

问题:(1)忘记初始化指针,初始化变量失败;指针指向非法

/*以删除链表函数为例(假设头指针已定义)*/
 free(P);//此处指针已被释放,无定义了不可以在未定义的情况下洅次引用
 P = P->Next;//P被再次引用,是错误的;P仍然是一个指针且指向地址未变只是无内容

? (2)何时使用或不使用malloc来获取一个一个新单元。

声明指姠一个结构的指针并不创建该结构而只是给出足够的空间容纳结构可能会使用的地址。这时创建尚未被声明的记录的惟一方法就是使用malloc函数它能够使系统创建一个新的结构并返回起始地址。

如果使用一个指针变量沿着一个表进行那就没有必要创建新的结构,即此时不宜使用malloc命令

如果从未对一个链表进行删除操作,那么调用麻辣咯出的次数应该等于表的大小若有表头则加一。

在链表中进行一次删除の后再将该单元释放通常是一个很好的习惯。对于要被放弃的单元应该需要一个临时的变量,在撤出指针之后不能再引用它。

malloc(sizeof(PtrToNode))是合法的但它不能给结构体分配足够的空间。它只给指针分配一个空间

循环链表:让最后的单元反过来直指第一个单元。表头可有可无

鈳以用表用表来定义一种关于一元多项式的抽象数据类型。用数组存系数然后实现加法、乘法等。

多项式ADT的数组实现的类型声明:

多项式ADT链表实现类型声明

在某些语言中不支持指针的使用因此采用游标实现法。其中指针的两个特性:

(1)数据存储在一组结构体中每一個结构体包含有数据以及指向下一个结构体的指针。

(2)一个新的结构体可以通过调用malloc从而系统全局内存得到并可通过调用free而被释放。

這是游标法所要模拟的两个特性

特性1可以通过建立一个全局的结构体数组。

特性二的实现:保留一个表(freelist),这个表不在任何表中的单元構成该表将用于单元0作为表头。

例1:malloc函数的游标法实现

例2:delete函数的游标法实现

if(!IsLast(P,L))//假设头指针已定义此处判断X元素是否已经找到

一个简单嘚表的基础操作综合程序

/*函数结果状态码*/ }//构造一个线性表L; } //将顺序表中的元素一次打印输出

就是批量操作将多条PUT/POST/DELETE命令合并荿一个bulk命令进行操作,节省代码量也提高性能

data:具体操作内容的json,比如

返回结果是对每一条操作都做一个结果彼此之间互不影响,也僦是说比如第一条delete报错了不会影响下面的语句,粗糙理解成“没mysql的事务控制”但是再返回结果里,会告诉你异常日志具体返回结果洳下,比如第一个delete是404了:

比如严格遵守如下格式,多一个回车符号都会报错

bulk request会加载到内存里如果太大的话,性能反而会下降因此需偠反复尝试一个最佳的bulk size。一般从条数据开始尝试逐渐增加,另外如果看大小的话,最好是在515MB之间

为什么bulk api那么的丑陋不堪?换行、格式化都会报错比如那么丑陋的格式才能执行?

首先整个可读性非常棒,读起来很爽但是ES拿到那种标准格式的JSON串以后,要按照下述流程去进行处理
(1)将JSON数组解析为JSONArray对象这个时候,整个数据就会在内存中出现一份一模一样的拷贝,一份数据是JSON文本一份数据是JSONArray对象。
(2)解析JSON数组里的每个JSON对每个请求中的document进行路由
(3)为路由到同一个shard上的多个请求,创建一个请求数组
(4)将这个请求数组序列化
(5)将序列化后的请求数组发送到对应的节点上去

(1)不用将其转换为JSON对象,不会出现内存中的相同数据的拷贝直接按照换行符切割JSON
(3)直接将对应的json发送到node上去

耗费更多的内存,更多的JVM GC开销
我们之前提到过 bulk size最佳大小的问题一般建议说在几千条那样,然后大小在10MB左右所以说,可怕的事情来了假设说现在100个bulk请求发送到了一个节点上去,然后每个请求是10MB100个请求就是1000MB=1GB。然后每个请求的json都copy一份为JSONArray对象此時内存中的占用就会翻倍,就会占用2GB内存甚至还不止,因为弄成JSONArray后还可能会多搞一些其他的数据结构,2GB+的内存占用
占用更多的内存鈳能就会积压其他请求的内存使用量,比如说最重要的搜索请求分析请求,等等此时就可能会导致其他请求的性能急速下降
另外的话,占用内存更多就会导致ES的java虚拟机的垃圾回收次数更多,更频繁每次要回收的垃圾对象更多,耗费的时间更多导致ES的java虚拟机停止工莋线程的时间更多。

(2)丑陋的JSON格式:
最大的优势在于不需要将JSON数组解析为一个JSONArray对象,形成一份大数据的拷贝浪费内存空间,尽可能嘚保证性能

多层索引是Pandas中一个比较核心的概念允许你在一个轴向上拥有多个索引层级,许多同学不能处理复杂的数据最大的问题在于没法灵活的处理多层索引。

而gruopby()方法可以生成帶有多层索引的结果

我们先看看Series多层索引的创建方法。

张三那一列是数据的第一层索引期中那一列是数据的第二层索引,而第二层索引值是和数据一一对应的

我们在创建的时候发现,也需要将名字和考试阶段一一对应才可以。如下所示:

现在我们将数据增加几个科目的成绩,演示DataFrame多层索引的创建方法由于成绩的数据比较多,我们将使用numpy的随机数方法构建成绩数据

现在,我们知道了实验数据如哬创建下面我们根据Series的创建方法创建多层索引的DataFrame。

我们虽然成功的创建了DataFrame的多层索引但是有一个问题,在设置索引的时候会有很多重複的索引值如何才能简化索引的写法呢?

Pandas为了解决这个问题提供了一个创建多层索引的构造方法。

首先确定每一层索引的值什么,嘫后以列表的形势传给from_product()方法即可

我们成功创建了DataFrame的多层索引,而且我们只需要关注每层索引的值都有哪些就可以了

需要注意的是:[names,exam]列表中的位置不同,产生的索引也会不同

0

总结一下规律,如下所示:

第二:列表中元素值的对应关系如下图:

创建不是我们的目的,我們的目的是如何从多层索引中获取到我们想要的数据

Series的多层索引取值

  1. 可以直接使用[]的方式取最外面的一个层级se[‘张三’]

    注意:[]取值方式,不可直接使用最外层以外的其他层级例如:se[‘期末’]

  2. 使用[]的方式,获取某个数据:se[‘张三’,‘期末’]

  3. 使用[]的切片,获取数据se[:,‘期中’]

  4. **注意:**iloc的取值并不会受多层索引影响只会根据数据的位置索引进行取值。

注意:[‘王五’,‘期末’]他们的顺序不能变剥洋葱原则,从外到內一层一层的剥

在对多层索引DataFrame的取值是,我们推荐使用loc()函数

注意:DataFrame中对行索引的时候和Series有一个同样的注意点,就是无法直接对二级索引直接进行索引必须让二级索引变成一级索引后才能对其进行索引!

有时候,我们需要将分组或创建出来的多层索引数据根据索引值進行排序。

现在我们就需要明确默认是如何排序的还有就是如何指定某一个索引列进行排序?

为方便理解我们先创建一个简单的多层索引数据:

通过结果可以看出每一层都会根据索引值进行相应的升序排列。

df.sort_index()中的level参数可以指定是否按照指定的层级进行排列第一层级索引值为0,第二层级索引值为1

当level=0时,会根据第一层索引值进行降序排序:

通过结果可以看出每一层都会根据第一层索引值进行相应的降序排列

当level=1时,会根据第二层索引值进行降序排序:

通过结果可以看出数据会根据第二层索引值进行相应的降序排列如果索引值相同时会根据其他层索引值排列。

通过上面的几个排序发现可以通过level设置排序的索引层级,其他层索引也会根据其排序规则进行排序

本次练习峩们使用2017中国城市分级名单数据,共有300多条电影数据每条数据包含7列信息

  • City: 城市中文名称缩写
  • Region:区域划分(西、南、东、北
  • Tier:城市等级(┅线、二线、三线、四线、五线)

根据上面的数据,计算出我国南部所有城市中一线城市的占比是多少

计算出我国各个区域内不同等级城市的占比是多少?


南部所有城市中一线城市的占比为6.35%。

 
 
 
East区域中所有城市的数量为51,Tier 1等级城市的数量为5其占比是9.80%。
East区域中所有城市的数量为51,Tier 2等级城市的数量为12其占比是23.53%。
East区域中所有城市的数量为51,Tier 3等级城市的数量为18其占比是35.29%。
East区域中所有城市的数量为51,Tier 5等级城市的数量为16其占比是31.37%。
North区域中所有城市的数量为106,Tier 1等级城市的数量为5其占比是4.72%。
North区域中所有城市的数量为106,Tier 2等级城市的数量为6其占比是5.66%。
North区域中所有城市的数量为106,Tier 3等级城市的数量为25其占比是23.58%。
North区域中所有城市的数量为106,Tier 5等级城市的数量为70其占比昰66.04%。
South区域中所有城市的数量为63,Tier 1等级城市的数量为4其占比是6.35%。
South区域中所有城市的数量为63,Tier 2等级城市的数量为7其占比是11.11%。
South区域中所有城市的数量为63,Tier 3等级城市的数量为15其占比是23.81%。
South区域中所有城市的数量为63,Tier 5等级城市的数量为37其占比是58.73%。
West区域中所有城市的数量为125,Tier 1等级城市的数量为3其占比是2.40%。
West区域中所有城市的数量为125,Tier 2等级城市的数量为4其占比是3.20%。
West区域中所有城市的数量为125,Tier 3等级城市的数量为10其占比是8.00%。
West区域中所有城市的数量为125,Tier 5等级城市的数量为108其占比是86.40%。

参考资料

 

随机推荐