精华内容
下载资源
问答
  • 一般完成时的结构形式
    千次阅读 多人点赞
    2019-01-17 21:23:59
    导论:什么是数据结构:指的是一种外在的数据展示的形式。算法:计算的方法,可以理解为完成某一个过程中的执行思路。
    
    一:基本概念
        1.数据结构:对数据的一种存储和组织方式,相互之间存在一种或者多种特定关系的数据的集合。数据就是存储的
        有用的信息 数据元素:数据的基本单位,又称节点、元素
    
        2.数据整体结构:逻辑结构、存储结构、运算 三者构成数据完整结构
    二:数据结构分类:(清晰逻辑如下)

    根据逻辑结构:
    1.线性结构:表中各个节点具有线性关系:有一个开始节点和一个终端节点,所有节点做多只有一个直接前驱节点
    和一个直接后继节点,如:栈、队列、串等都是线性结构线性表:有且仅有一个开始节点,有且仅有一个直接后驱
    结点,有且只有一个终结结点,顺序存储的线性表叫做顺序表,链式存储的叫做链表
    
    2.非线性结构:各个节点之间具有多个对应关系:一个节点与多个直接前驱节点和直接后继节点:如数组、树结构
    数组多行多列,所以显示出非线性结构
    
      根据逻辑结构:
        1.线性结构:表中各个节点具有线性关系:有一个开始节点和一个终端节点,所有节点做多只有一个直接前驱节点
        和一个直接后继节点,如:栈、队列、串等都是线性结构线性表:有且仅有一个开始节点,有且仅有一个直接后驱
        结点,有且只有一个终结结点,顺序存储的线性表叫做顺序表,链式存储的叫做链表
    
        2.非线性结构:各个节点之间具有多个对应关系:一个节点与多个直接前驱节点和直接后继节点:如数组、树结构
        数组多行多列,所以显示出非线性结构
    
        根据存储方式:
        1.顺序存储:就是在一块连续的存储区域一个接一个的存放数据,顺序存储方式把逻辑上相邻的节点存储在物理位置上相邻的存储单元里,节点间的逻辑关系由存储单元的邻接关系体现。也叫作顺序存储结构,一般采用数组或者结构数组来描述。
        2.链式存储:不要求逻辑上相邻的节点在物理位置上相邻,节点间的逻辑关系由附加的引用字段表示,一个节点的引用字段指向下一个节点的存放位置,一般在原数据项中增加引用类型(地址)来表示节点间的位置关系
        3.索引存储:采用附加的索引表的方式来存储结点信息。索引表由索引项组成,一般形式为:(关键字、地址),关键字是能够标识一个结点的数据项。(set采用hash算法直接根据关键字算出存储地址,因此要重写hashcode方法)
        *稠密索引:每个结点在索引表中都有一个索引项,索引项的地址指示结点所在的存储位置
        *稀疏索引:一组结点在索引表中只对应一个索引项,索引项的地址指示一组结点的起始存储位置
        4.散列存储:根据结点的关键字直接计算出该结点的存储地址的一种存储方式(hash表)
    
    三:常用的数据结构
    
        1.数组(Array):是一种聚合数据类型,最基本的数据结构。可以有一维、二维以及多维等表现形式(顺序存储)
        2.栈(Stack):是一种特殊的线性表,遵循先进后出的原则,即只能从顶点进入和删除,用于重要数据现场保护
        3.队列:(Queue):特殊的线性表,只能在队头删除,队尾插入 操作
        4.链表(Linked List):按照链式存储结构进行存储,在物理上存在非连续的特点。链表结构中数据元素的逻辑顺序通过链表中的引用链接次序来实现.由一系列数据结点构成。每个数据结点又包含有数据域和引用域两部分。引用域保存了下一个元素保存的地址。
        5.树(Tree):典型非线性结构。
        6.堆(Heap):特殊的树形结构,二叉堆,特点是根节点的值要么是最大要么是最小,并且根节点的两个字数也是堆结构
        7.散列表(Hash):根据关键字T f(T)算出具体位置
    
    四:顺序表结构
        由于顺序表是一次存放的,只要知道了该顺序表的首地址以及每个数据元素所占用的存储长度,很容易计算出任何
        一个数据元素的位置(一般性,如果所有结点的类型相同,则每个结点所占用的存储空间大小也相同)
        顺序表具体实现:顺序表操作是基于数组实现,增删改查都是在数组上实现的,因为数组是可以看做是最基本的数
        据结构
    
    五:链表结构
        分为数据部分以及地址部分。数据部分保存实际数据,而地址部分保存的是下一个结点的地址,缺点:浪费存储空
        间,因为需要保存额外的引用,其次对于链表的访问只能从表头逐个查找,然后一个个往下找,不能像顺序表一样
        随机访问,链表有单链表、双向链表、单循环链表等
        链表具体表现形式:在类中用类的属性表示,用含有一个nextNode引用用来指向下一个元素,如:一个Node节点里
        面存储了一个对象,Flow(含有字段id,num),而Node{id,Flow(id,num)}就是这种格式
    
    六:栈
        只能在栈顶操作数据,按照“后进先出”的原则处理节点数据
    
    七:队列
        和栈的定义大体一致,只是运算规则有点不同,队列满足先进先出(FIFO),入队列是把数据加到最后一个结点,
        出队列就是取出第一个数据,并且进行删除操作,数据展现形式也是基于数组
    
    八:树
        1.树形用于描述线性结构所不能实现的结构,比如数据簇,以及多个后继结点等数据形式
    
        类型:
        二叉树:每个结点最多只有两个子结点,因为有左右之分,因此是有序树
        满二叉树:除了最下面一层外,其他的都有两个结点
        完全二叉树:除了最下面一层外,其他每个结点都有两个结点,并且最后一个结点按照从左到右的顺序连续存在
        存储方式:也有顺序存储以及链式存储,并且顺序存储也是基于数组实现,而链式存储也是采用引用,但是有两个引用,一个是左结点引用,一个是右
        结点引用。建议采用链式存储
        一般的数据结构都有顺序存储以及链式存储两种存储形式
    更多相关内容
  • 前言 现在越来越多的数据以json的格式进行存储,例如通过网络爬虫,那些异步存储的数据往往都是json类型的;再如企业数据库中的日志数据,也会以json的格式存放。前不久,一位网友就碰到了这个问题,手中Excel...

    前言


          现在越来越多的数据以json的格式进行存储,例如通过网络爬虫时,那些异步存储的数据往往都是json类型的;再如企业数据库中的日志数据,也会以json的格式存放。前不久,一位网友就碰到了这个问题,手中Excel存储的数据并不是标准化的结构数据,而是以json格式存储在Excel的每个单元格。那今天我们就来聊聊如何利用Python将半结构化的json数据转换成结构化数据

    简单的json格式

          其实json的格式与Python中的字典非常类似,数据放在大括号({})内,每一个元素都是键值对,元素之间以逗号隔开。我们都知道,在Python中,是可以将一个字典对象转换成数据框的,接下来我们就通过一个简单的例子慢慢进入复杂的环境。

    # 加载第三方包
    import pandas as pd # 数据处理包
    import numpy as np # 数值计算包
    import json # json文件转换包

    # 一个简单的json格式字符串
    string1 = '{"name":"Sim","gender":"Male","age":28,"province":"江苏"}'
    string2 = '{"name":"Lily","gender":"Feale","age":25,"province":"湖北"}'

    # 查看数据类型
    type(string)

    # 将json格式转换为字典
    dict1 = json.loads(string1) dict2 = json.loads(string2) type(dict1)

          上面构造的json数据实际上是字典型的字符串,可以直接通过json包中的loads函数完成由字符型到字典型的转化。那如何根据这两个字典,组装成一个2行3列的数据框呢?只需借助于pandas模块中的DataFrame函数即可:

    # 将字典数据转换为数据框
    pd.DataFrame([dict1,dict2])



    这里需要注意的是,上面的字典,是一个键仅对应一个值的情况,如果直接将dict1传递给DataFrame函数是会出错的,除非你指定索引值。所以,当你有两个及以上的这种字典时,你是可以传递给DataFrame函数的,但必须以可迭代的形式(如列表、元组、序列等)。还有一种字典,是一个键对应多个值,如果是这样的字典,就可以直接将字典扔给DataFrame函数形成数据框了:

    string =  '{"name":["Sim","Lily"],"gender":["Male","Feale"],\
                "age":[28,25],"province":["江苏","湖北"]}'

    # 转换为数据框            
    pd.DataFrame(json.loads(string))


    尽管这样完成了一个字典到数据框的转换,但千万注意,如果一个字典的键包含多个值,那一定要保证所有键对应的值个数一致!OK,了解了这个基础知识点后,我们来两个案例,加深一下对知识点的理解。

    经典案例一

          先来看一下Excel表中存储的数据格式,现在的问题是,如何将表中UserBasic一列拆解出来,即所有键值对转换成变量名和观测值。


    data1 = pd.read_excel(r'C:\Users\Administrator\Desktop\data1.xlsx')
    data1.head()
    
    data1.UserBasic[0]



    从上面的反馈结果来看,表中UserBasic字段的单元格存储的json字符串都是一个键仅对应一个值,这跟上面介绍的string1和string2是一致的,故如果需要转换成数据框的话,需要将这些转换的字典存放到列表中。具体操作如下:

    # UserBasic列中的信息拆分到各个变量中
    basic = []for i in data1.UserBasic:    basic.append(json.loads(i)) UserBasic = pd.DataFrame(basic) UserBasic.head()



    上面通过循环的方式将UserBasic字段的每一行解析成字典,并保存到列表中,最后通过DataFrame函数完成数据框的转换。接下来需要将拆分出来的这列,与原始表中的Id变量,Mobile变量整合到一起

    # 数据整合到一起
    final_data = pd.concat([data1[['Id','Mobile']],UserBasic], axis = 1) final_data.head()



    效果呈现还是蛮好的,但是有一点不好的是,通过for循环来完成毕竟不是高效的,如果数据量特别大,上百万行的话,那就得循环执行上百万次,会耗很多时间。这里我们借助于apply方法,避免显式的循环:

    # 避免循环的方式
    trans_data = pd.DataFrame(data1.UserBasic.apply(json.loads))
    # 数据整合到一起
    final_data = pd.concat([data1[['Id','Mobile']],trans_data], axis = 1)

    经典案例二

          我们接着看第二个例子,原始数据如下图所示,现在的问题是解析字段CellBehaviorData的同时,还要做一次聚合操作(每个用户ID近3个月的消费平均水平)。


    # 读取数据
    data2 = pd.read_excel(r'C:\Users\Administrator\Desktop\data2.xlsx')

    # 查看字段CellBehaviorData第一行的信息
    data2.CellBehaviorData[0]



    细心的你一定发现了个问题,这个字符串的起始和结尾并不是大括号({}),而是中括号([]),故接下来要做的第一件事就是去除这两个中括号;另一方面,behavior键对应的值是列表,而且列表中还有多个相同的键,如sms_cnt、cell_phone_num等。这样的json最后形成的数据框一定是多行的,即表中一个单元格会就可以转换成多行的数据框。不妨,我们先来看一下变量CellBehaviorData第一行形成是数据框张啥样:

    # 通过切片的方式去除首尾的中括号
    s = data2.CellBehaviorData[0][1:-1]
    # 将字符串转换成字典,并取出behavior键
    d = json.loads(s)['behavior']
    # 将字典转换为数据框
    df = pd.DataFrame(d) df



    这就是一行观测产生的多行数据框,现在的问题是如何将多行的数据框与每一个Id配对上。我们发现字典中除了behavior键,还有phone_num键,而且该键的值是唯一的,正好与上面数据框的cell_phone_num变量匹配。所以,待会做数据关联的时候,就使用phone_num变量和cell_phone_num变量。

    # 取出phone_num
    phone_num = [i['phone_num'] for i in data2.CellBehaviorData.str[1:-1].apply(json.loads)]

    # 取出CellBehaviorData字段,并解析为数据框
    df = pd.concat([pd.DataFrame(j) for j in [i['behavior'] for i in data2.CellBehaviorData.str[1:-1].apply(json.loads)]])# 将Id与手机号捆绑user = pd.concat([pd.Series(phone_num,name = 'phone_num'), data2.Id], axis = 1)

    # 以手机号作为数据的关联关联
    final_data = pd.merge(df, user, left_on = 'cell_phone_num', right_on='phone_num') final_data.head()

    # 查看数据类型
    final_data.dtypes



    为了速度的提升,上面使用了apply技术和列表解析式的技巧将json数据拆解成数据框,同时,发现除Id变量的其他变量类型都是字符串型,需要对数值变量进行转换,因为接下来还要做聚合操作:

    # 挑选需要转换类型的变量名称
    vars = ['call_cnt','call_in_cnt','call_in_time','call_out_cnt','call_out_time','net_flow','sms_cnt','total_amount']

    # 对以上变量进行数据类型转换
    df_convert = final_data[vars].apply(lambda x: x.astype('float'))

    # 从新完成数据合并
    final_data2 = pd.concat([df_convert, final_data.loc[:,~final_data.columns.isin(vars)]], axis = 1)

    # 对每个id计算近三个月的平均指标值
    stats = final_data2.loc[final_data2.cell_mth.isin(['2017-08','2017-07','2017-06']),:].groupby('Id').aggregate(np.mean) stats


     

    大功告成,这种类型的数据我们就可以游刃有余的完成转换。但如果CellBehaviorData字段不含有phone_num(键)变量的话如何实现数据关联呢?这里把解决方案的代码呈现出来:

    # 构造空列表,存放CellBehaviorData变量每一行形成的数据框
    final_data = []

    # 使用zip函数捆绑两列,并使用for循环
    for Id,CellBehaviorData in zip(data2.Id, data2.CellBehaviorData):    
       # 组装数据框    mydf = pd.DataFrame(json.loads(CellBehaviorData[1:-1])['behavior'])
       # 将数据框与变量Id组装起来    final_data.append(pd.concat([pd.Series(np.repeat(Id,mydf.shape[0]), name = 'Id'),mydf], axis = 1))
    #这个地方写点自己看作者文档遇到的一些困难, 主要是repeat函数的用法np.repeat(Id,mydf.shape[0])表示的就是取Id的值然后复制mydf.shape[0]次
    # 构造最终的数据框    
    final_data = pd.concat(final_data)# 数据类型转换

    # 挑选需要转换类型的变量名称
    vars = ['call_cnt','call_in_cnt','call_in_time','call_out_cnt','call_out_time','net_flow','sms_cnt','total_amount']
    # 对以上变量进行数据类型转换
    df_convert = final_data[vars].apply(lambda x: x.astype('float'))

    # 从新完成数据合并
    final_data2 = pd.concat([df_convert, final_data.loc[:,~final_data.columns.isin(vars)]], axis = 1) final_data2

    # 对每个id计算近三个月的平均指标值
    stats = final_data2.loc[final_data2.cell_mth.isin(['2017-08','2017-07','2017-06']),:].groupby('Id').aggregate(np.mean) stats

          虽然通过上面的方法可以实现数据的关联和匹配,但个人觉得并不是很理想,因为这里毕竟使用了for循环,一旦数据量大的话,执行起来会比较缓慢,如果高人,还请指点。

    结语


          OK,今天关于半结构化的json数据转数据框的分享就介绍到到这里,希望本篇文章对各位网友有一定的帮助。如果你有任何问题,欢迎在公众号的留言区域表达你的疑问。欢迎各位朋友继续转发与分享文中的内容,让更多的朋友学习和进步。有关文中的脚本和数据可至下方的链接获取,再次感谢网友对我的关注和支持。

    关注“每天进步一点点2015

    相关材料下载链接

    链接: https://pan.baidu.com/s/1kVzNnFp 密码: tdkm

    展开全文
  • 基于PaddleHelix完成RNA结构预测竞赛的前置基础知识一、化学与遗传学——从孟德尔的豌豆说起显性基因与隐性基因弱化学键弱键和强键决定大分子的结构核酸承载遗传信息——肺炎双球菌的转化实验二、RNA——初识核糖...

    在解决RNA结构预测这个世界级难题之前,首先要做的是搞懂分子生物学相关知识以及RNA的二级结构

    本文内容基于官方提供的RNA二级结构讲义:

    中国大学MOOC上武汉大学的分子生物学课程Molecular Biology:

    以及知网查阅的论文:

    我在以上四篇文献以及中国大学MOOC的课程基础上结合自己的理解对RNA的基础知识做了整理,欢迎各位读者一起交流讨论~

    一、化学与遗传学——从孟德尔的豌豆说起

    显性基因与隐性基因

    孟德尔从豌豆杂交实验结果,得出了相对性状中存在着显性基因和隐性基因的原理。

    基因概念是孟德尔在推想中提出来的,虽然当时他并没有提出“基因”这个科学名词。孟德尔认为遗传单位(基因)具有高度的稳定性,一个显性基因和它相对的隐性基因在一起的时候,彼此都具有稳定性,不会改变性质。

    弱化学键

    弱化学键对生物体至关重要,部分原因是因为弱化学键能在细胞的生理条件下形成和断裂,一个最简单的例子是DNA的复制,DNA的复制过程中,其两条链是要分开的,分开以后才能作为模板进行DNA复制,分开过程其实就是弱化学键氢键的断裂过程,在子代DNA合成过程中,氢键又会形成。

    弱键和强键决定大分子的结构

    • 分子间和分子内相互作用决定大分子高级结构
    • 氢键的排列方式决定蛋白质的特定构象
    • 大多数蛋白质由两个或三个结构域装配而成(不同的组合方式一不同的功能)
    • 弱化学键把蛋白质放在DNA和RNA的正确位置(序列或构象特异性)
    • 变构:通过改变蛋白质的形状调控其功能(通过结合配体或相互作用)
    • 不是所有蛋白质功能的调控都是通过变构进行的(募集作用)

    核酸承载遗传信息——肺炎双球菌的转化实验

    20世纪30年代,遗传学家就开始推测什么样的分子可能具有基因所需要的稳定性,同时又有为进化提供基础的长久的、突发的突变形式

    该实验证明了S型细菌中含有一种转化因子,将R型细菌转化成了S型细菌,当时得出的实验结论是DNA可能是关键的遗传物质。实际上,转化因子就是DNA,但是当时并没有提出DNA这个名词

    二、RNA——初识核糖核酸

    RNA的结构特征

    RNA和DNA一样,也是由各种核苷酸通过3′,5′-磷酸二酯键连接构成的多核苷酸链,但与DNA有一些差异。

    RNA与DNA的不同之处

    RNADNA
    核糖核糖2’脱氧核糖
    碱基尿嘧啶胸腺嘧啶
    结构多聚核苷酸单链多聚核苷酸双链

    RNA的生物学功能

    • RNA是某些病毒的遗传物质
    • RNA是从基因到蛋白质合成的媒介(mRNA)
    • RNA是mRNA上密码子与氨基酸的接头分子(tRNA)
    • RNA是一种调节分子(regulatory RNA )
    • RNA有结构功能,rRNA是核糖体的组成成分
    • 一些RNA在细胞中催化重要反应-(RNase P ribozyme, large rRNA, self-splicing introns)

    RNA的结构基础——碱基

    RNA的碱基主要有4种,即A(腺嘌呤)、G(鸟嘌呤)、C(胞嘧啶)、U(尿嘧啶),其中,U(尿嘧啶)取代了DNA中的T(胸腺嘧啶)。

    碱基的配对——一个碱基只能与另一个碱基配对

    典型碱基对有:

    • A-U
    • G-C
    • G-U



    RNA的表示结构

    RNA的结构可分为一级结构、二级结构和三级结构:

    • 一级结构:可以理解为遗传碱基对编码
    • 二级结构:RNA的平面表示
    • 三级结构:RNA的立体结构

    三、RNA的二级结构——RNA链自身折叠形成类似A-DNA的局部双螺旋

    RNA通常是单链的,除了双链外,它还具有多种形式的二级结构


    上面列举的是一些比较常见的二级结构,下面是由上面这三种二级结构衍生出来的二级结构

    假结

    假结是由不相邻的RNA片段碱基配对而形成的复杂结构


    Stem Loops (Hairpins)

    茎环一般至少有4个碱基

    Bulge Loops

    当结构一侧的基无法形成碱基对时会形成凸环

    Interior Loops

    当结构两侧的碱基无法形成碱基对时会生成内环

    Junctions (Multiloops)

    两个或两个以上的双绞合区绞合形成闭合结构

    Kissing Hairpins

    两个独立的茎环相互组合

    四、RNA二级结构的表示方法

    平面图形表示法

    平面图形表示法可以直观地看出RNA的结构

    [1]吴建英,王淑琴.RNA二级结构点括号图与CT文件表示法的相互转换算法研究[J].天津师范大学学报(自然科学版),2012,32(04):32-36.

    圆点图表示法

    由圆表示的二级结构的碱基对,为结构中每个碱基对绘制弧,通过索引对(i,j)描述碱基对,表示碱基顶点之间的链接,如果有任何弧交叉,则存在假结


    RNA二级结构平面图

    RNA二级结构平面图是另外一种比较常见的RNA二级结构表示方法,在这种表示方法中RNA 序列中碱基间的配对信息一目了然,各个基本组成构件也表现的十分清楚,常常作为效果图输出。

    螺旋区点阵图

    螺旋区点阵图,是指以数学坐标图的方式显示RNA二级结构的一种方法,设立一个数学坐标图,首先按照 RNA 的序列情况在坐标图中分别标记出横、纵坐标值,然后通过查找构成碱基配对的序列的坐标,就能把该 RNA 结构的碱基对在坐标图上施划出来;再通过一线与横、纵坐标各成 45°角的斜线,串过的全部碱基对,就可标出该 RNA 结构的茎区结构。

    点括号法

    点括号表示法就是用点和成对的括号来表示RNA的二级结构信息:

    • RNA序列中的未产生碱基互补配对的自由碱基用“.”表示
    • 而形成互补碱基对的两个碱基分别用一对“(”和“)”表示
    • 碱基对中相对靠近5’端的碱基用“("进行表示
    • 碱基对中相对靠近3’端的碱基用“)”进行表示

    [1]吴建英,王淑琴.RNA二级结构点括号图与CT文件表示法的相互转换算法研究[J].天津师范大学学报(自然科学版),2012,32(04):32-36.

    CT 文件表示法

    CT文件格式初步由ZuKerl提出,用于定义RNA二级结构和核苷酸序列,包含多个序列的多个子结构信息。在CT文件中,首行中整数N表示核苷酸序列的总长度,N在后面是预测二级结构得到的自由能和RNA分子的描述信息。
    CT文件中包含6列数据:

    • 第1列为索引信息;
    • 第2列表示RNA二级结构中从5 '端开始到3 '端结束的标题(A, U, G和C) ;
    • 第3列是与之相邻的前一个栅极的编号;
    • 第4列是与之相邻的后1个串联的编号;
    • 第5列表示是否存在与该字符串配对的串行,’ 0 ‘表示无配对字符串,非’ 0 '表示存在配对字符串,并且用数字n表示与配对的串联编号;
    • 第6列同第1列。

    [1]吴建英,王淑琴.RNA二级结构点括号图与CT文件表示法的相互转换算法研究[J].天津师范大学学报(自然科学版),2012,32(04):32-36.

    CT文件可以由RNA二级结构预测软件得到,被用于计算RNA之间的相似性及预测其类别

    五、RNA二级结构预测的主要方法

    Energy minimization

    • dynamic programming approach
    • does not require prior sequence alignment
    • require estimation of energy terms contributing to secondary structure

    Comparative sequence analysis

    • Using sequence alignment to find conserved residues and covariant base pairs. and covariant base pairs.
    • most trusted

    六、使用PaddleHelix-螺旋桨生物计算平台完成RNA二级结构预测

    螺旋桨PaddleHelix,是基于百度飞桨深度学习框架开发的生物计算工具和平台。 螺旋桨针对生信&计算机交叉学科的学习者、研究者和合作伙伴,提供一整套开源工具集和计算平台,支持构建针对新药研发、疫苗设计、精准医疗场景的技术方案。

    RNA二级结构预测包括一系列的线性时间RNA二级结构分析算法: LinearFold和LinearPartition

    LinearFold

    LinearFold能够在线性时间内预测RNA二级结构,在长序列RNA上的预测速度远远大于传统算法。其中,LinearFold能够将新冠病毒全基因组序列(约30,000 nt)二级结构预测时间从55分钟降低到27秒,速度提升120倍。

    同时LinearFold在预测精度上相比传统算法也有提升。尤其对于长序列RNA二级结构(如16S和23S rRNA二级结构)和长碱基对(相距500+ nt)预测上,LinearFold预测精度有显著地提升。

    LinearPartition

    2020年,百度再次发表世界最快RNA配分方程和碱基对概率预测算法LinearPartition。

    该算法功能更加强大,可以模拟RNA序列在平衡态时成千上万种不同结构的分布,并预测碱基对概率矩阵。LinearPartition算法同样被ISMB顶会接收并在Bioinformatics杂志上发表,论文链接请见:LinearPartition: linear-time approximation of RNA folding partition function and base-pairing probabilities

    在使用上述两种算法之前,我们需要安装PaddleHelix:

     !pip install paddlehelix
     from IPython.display import clear_output
     clear_output()
     print("安装成功")
    
        安装成功
    

    LinearFold调用

    机器学习模型

    linear_fold_c(rna_sequence, beam_size = 100, use_constraints = False, constraint = “”, no_sharp_turn = True)

    热力学模型

    linear_fold_v(rna_sequence, beam_size = 100, use_constraints = False, constraint = “”, no_sharp_turn = True)

    参数说明

    • rna_sequence: string, 需要预测结构的RNA sequence
    • beam_size: int (optional), 控制beam pruning size的参数,默认值为100。该参数越大,则预测速度越慢,而与精确搜索相比近似效果越好;
    • use_constraints: bool (optional), 在预测二级结构时增加约束条件, 默认值时False。为True时, constraint参数需要提供约束序列;
    • constraint: string (optional), 二级结构预测约束条件, 默认为空。当提供约束序列时, use_constraints参数需要设置为True。该约束须与输入的RNA序列长度相同,每个点位可以指定“? . ( )”四种符号中的一种,其中“?”表示该点位无限制,“.”表示该点位必须是unpaired,“(”与“)”表示该点位必须是paired。注意“(”与“)”必须数量相等,即相互匹配。具体操作请参考运行实例。
    • no_sharp_turn: bool (optional), 不允许在预测的hairpin结构中出现sharp turn, 默认为True。

    返回值

    • tuple(string, double): 返回一个二元组, 第一个位置是结构序列, 第二个位置是结构的folding free energy
    # 二级结构预测(无约束条件)
    import pahelix.toolkit.linear_rna as linear_rna
    input_sequence = "AACUCCGCCAGGCCUGGAAGGGAGCAACGGUAGUGACACUCUCUGUGUGCGUAGGUUGCCUAGCUACCAUUU"
    linear_rna.linear_fold_c(input_sequence)
    
        ('..((((.(((....)))...))))....((((((............................))))))....',
         0.4548597317188978)
    
    # 二级结构预测(有约束条件)
    constraint = "??(???(??????)?(????????)???(??????(???????)?)???????????)??.???????????"
    linear_rna.linear_fold_c(input_sequence, use_constraints = True, constraint = constraint)
    
        ('..(.(((......)((........))(((......(.......).))).....))..)..............',
         -27.328358240425587)
    

    LinearPartition调用

    机器学习模型

    linear_partition_c(rna_sequence, beam_size = 100, bp_cutoff = 0.0, no_sharpe_turn = True)

    热力学模型

    linear_partition_v(rna_sequence, beam_size = 100, bp_cutoff = 0.0, no_sharpe_turn = True)

    参数说明

    • rna_sequence: string, 需要计算配分函数和碱基对概率的RNA sequence
    • beam_size: int (optional), 控制beam pruning size的参数,默认值为100。该参数越大,则预测速度越慢,而与精确搜索相比近似效果越好;
    • bp_cutoff: double (optinal), 只输出概率大于等于bp_cutoff的碱基对及其概率, 0 <= pf_cutoff <= 1, 默认为0.0;
    • no_sharp_turn: bool (optional), 不允许在预测的hairpin结构中出现sharp turn, 默认为True。

    返回值

    • tuple(string, list): 返回一个二元组, 第一个位置是配分函数值, 第二个位置是存有碱基对及其概率的列表
    import pahelix.toolkit.linear_rna as linear_rna
    input_sequence = "UGAGUUCUCGAUCUCUAAAAUCG"
    UAAAAUCG"
    linear_rna.linear_partition_c(input_sequence, bp_cutoff = 0.2)
    
        (0.6399235725402832,
         [(4, 13, 0.2007114291191101),
          (10, 22, 0.24662047624588013),
          (11, 21, 0.24573349952697754),
          (12, 20, 0.2092728614807129)])
    

    如需运行代码,请前往AI Studio:

    七、螺旋桨RNA结构预测竞赛:Unpaired Probability Prediction

    核糖核酸(Ribonucleic Acid),简称RNA,在遗传编码、翻译、调控、基因表达等过程中发挥作用。RNA的核心功能可以分为两类:

    1. 传递遗传信息: 大多数生命体的遗传信息存在于DNA中,DNA通过转录生成RNA,同时也将遗传信息传递给RNA;RNA进一步翻译产生蛋白质,而蛋白质是遗传信息的终极载体。另有一类生命体,如新冠病毒这样的RNA病毒,它们没有DNA,RNA中直接存储了所有的遗传信息。
    2. 调控基因表达: 得益于非编码RNA(non-coding RNA)多种多样的作用,RNA的结构在基因表达的实现过程中发挥着至关重要的作用。

    在这里插入图片描述
    RNA序列由四种碱基组成,分别是腺嘌呤,胞嘧啶,鸟嘌呤和尿嘧啶。这四种碱基组成的序列就是RNA序列,也叫做RNA的一级结构。RNA序列在空间上会折叠、扭曲、形成特定的结构。我们把2D平面上由碱基配对形成的结构称之为RNA的二级结构,而将3D空间上形成的立体结构称之为RNA的三级结构。

    在这里插入图片描述
    2019年7月,百度研究院发表了第一个重磅成果:世界上最快的RNA二级结构预测算法LinearFold,相关论文被领域顶会ISMB 接收,并发表在权威杂志Bioinformatics上。LinearFold算法可将新冠病毒全基因组序列结构预测时间从55分钟缩短到27秒,分析速度提升近120倍。2020年1月31日,百度对外免费开放LinearFold算法平台,助力全球抗疫。

    2020年4月,百度研究院又发布了第二个重磅成果:世界上最快的RNA配分方程算法LinearPartition。相比于LinearFold,LinearPartition功能更强大,可用于更准确的描述RNA结构分布,因而在RNA基础研究和药物设计方面有更广泛的应用。以上两个算法在极大提高结构预测速度的同时,也提高了预测精度。如何在LinearFold和LinearPartition的基础上进一步提高结构预测精度,最终彻底解决RNA结构预测这个世界级难题,是一个值得探索的课题。

    本次竞赛旨在借助百度在RNA生物计算方向上的算法优势,通过百度大脑AI Studio平台,诚邀全球范围内计算生物、人工智能等领域从业者、爱好者和高等院校老师学生报名参赛,推动人工智能技术在生物计算上的技术应用。

    更多比赛说明请前往AI Studio查看:

    个人介绍

    北京联合大学 机器人学院 自动化专业 2018级 本科生 郑博培

    百度飞桨开发者技术专家 PPDE

    百度飞桨官方帮帮团、答疑团成员

    深圳柴火创客空间 认证会员

    百度大脑 智能对话训练师

    来AI Studio互粉吧~ 等你哦~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/147378

    欢迎大家fork喜欢评论三连,感兴趣的朋友也可互相关注一下啊~

    展开全文
  • 数据结构——栈的详解

    万次阅读 多人点赞 2020-04-20 00:02:43
    栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和...

    栈和队列是两种重要的线性结构,从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表,因此,可称为限定性的数据结构。但从数据类型角度看,他们是和线性表大不相同的两类重要的的抽象数据类型。

    C语言中的栈

    栈的定义

    栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行插入或者删除,所以栈又被称为后进先出的线性表(简称LIFO:Last in, First out.结构)。
    栈的示意图

    C语言中栈的基本操作

    栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈

    栈的初始化

    栈和线性表类似,也有两种存储表示方法顺序栈链栈,链栈的操作是线性表操作的特例,操作比较容易实现。顺序栈即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,top = 0表示空栈。由于栈在使用的过程中所需要的大小难以估计,所以通常是先为栈分配一个基本容量,然后再使用的过程中,当栈的空间不够使用的时候再继续追加存储空间。我们以下述类型说明作为顺序栈的定义:

    typedef struct{
    	SDataType *base; //栈底指针
    	SDataType *top;  //栈顶指针
    	int StackSize;   //当前已经分配的存储空间,以元素为单位 
    }SqStack;
    

    栈的初始化操作为:按照设定的初始分配量进行第一次存储分配,这里使用==malloc()==函数来分配存储空间。malloc()函数的详细说明请看:malloc详细说明。base作为栈底指针,它始终指向栈底,所以s.top = s.base可以作为栈空的标记。top为栈顶指针,top的初值指向栈底。每当插入一个元素时top加1,弹出一个元素时top减1,因此,非空栈中的栈顶指针始终在栈顶元素的下一个位置上
    栈顶指针和栈中元素的关系图

    //初始化顺序栈,构造一个空栈
    Status InitStack(SqStack &S){
    	//分配存储空间 
    	S.base = (SDataType *)malloc(STACK_INIT_SIZE*sizeof(SDataType));
    	if(!S.base){
    		//如果分配失败,则返回error 
    		return OVERFLOW;
    	}
    	//S.top 始终指向栈顶元素的下一个位置 
    	S.top = S.base;    //初始状态下为空栈 
    	S.StackSize = STACK_INIT_SIZE;   //当前已经分配的存储容量为100个 
    	return OK;	
    }
    

    判断是否为空栈

    当我们弹出栈顶元素时,往往需要判断一下栈是否为空来防止发生下溢。上面我们说到==base作为栈底指针,它始终指向栈底,所以s.top = s.base可以作为栈空的标记。==所以我们可以这样判断栈是否为空:

    //判断是否为空栈
    void judgeNull(SqStack &s){
    	if(s.top == s.base){
    		printf("此栈为空栈!\n");
    	}else{
    		printf("此栈不为空栈!\n");
    	}
    }
    

    判断是否为满栈

    当我们使一个元素入栈的之前,我们往往需要判断一下栈是否为满栈,防止发生上溢的情况。因为我们定义了一个StackSize来表示当前已经分配的存储空间,所以我们可以用s.top - s.base 来算出当前已经使用的栈空间。所以当s.top - s.base == s.StackSize 时表示已经满栈:

    //判断是否为满栈
    void judgeFull(SqStack &s){
    	if(s.top-s.base == s.StackSize){
    		printf("栈满!\n");
    	}else{
    		printf("栈未满!\n");
    	} 
    }
    

    入栈

    入栈时我们首先要判断栈是否为满栈,如果为满栈我们要首先追加存储空间,然后才能将元素入栈。realloc()函数详解请看realloc详解

    //入栈
    Status Push(SqStack &s,SDataType e){
    	SDataType *p;
    	//首先判断栈是不是满的(上溢) 
    	if(s.top-s.base == s.StackSize){
    		//追加空间 
    		p = (SDataType *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SDataType));
    		if(!p){
    			//如果没有找到符合条件的存储空间,则返回error 
    			return OVERFLOW;
    		}
    		//成功找到则使s.base指向p 
    		s.base = p;
    		s.top = s.base + s.StackSize;
    		s.StackSize +=  STACKINCREMENT;
    	}
    	//先插入元素,然后将栈顶指针加 1 
    	*(s.top) = e;
    	s.top++;
    	return OK;
    }
    

    出栈

    出栈时我们首先要判断栈是否为空栈。如果栈已经空了,则返回error。

    //出栈
    Status Pop(SqStack &s,SDataType &e){
    	//判断是否会发生下溢 
    	if(s.top != s.base){
    		s.top--;    //先将栈顶指针减 1 
    		e = *(s.top);
    	}else{
    		return 0;
    	}
    	return e;
    }
    

    C语言实现栈的具体代码

    #include<stdio.h>
    #include<malloc.h>
    
    #define STACK_INIT_SIZE 100  //栈的初始容量 
    #define STACKINCREMENT 10    //容量增量
    #define OK 1 
    #define OVERFLOW -2
    typedef int SDataType;
    typedef int Status;
    
    typedef struct{
    	SDataType *base; //栈底指针
    	SDataType *top;  //栈顶指针
    	int StackSize;   //当前已经分配的存储空间,以元素为单位 
    }SqStack;
    
    //初始化顺序栈,构造一个空栈
    Status InitStack(SqStack &S){
    	//分配存储空间 
    	S.base = (SDataType *)malloc(STACK_INIT_SIZE*sizeof(SDataType));
    	if(!S.base){
    		//如果分配失败,则返回error 
    		return OVERFLOW;
    	}
    	//S.top 始终指向栈顶元素的下一个位置 
    	S.top = S.base;    //初始状态下为空栈 
    	S.StackSize = STACK_INIT_SIZE;   //当前已经分配的存储容量为100个 
    	return OK;	
    } 
    
    //入栈
    Status Push(SqStack &s,SDataType e){
    	SDataType *p;
    	//首先判断栈是不是满的(上溢) 
    	if(s.top-s.base == s.StackSize){
    		//追加空间 
    		p = (SDataType *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SDataType));
    		if(!p){
    			//如果没有找到符合条件的存储空间,则返回error 
    			return OVERFLOW;
    		}
    		//成功找到则使s.base指向p 
    		s.base = p;  //系统会将原来的内容复制过来
    		s.top = s.base + s.StackSize;
    		s.StackSize +=  STACKINCREMENT;
    	}
    	//先插入元素,然后使栈顶指针加 1 
    	*(s.top) = e;
    	s.top++;
    	return OK;
    } 
    
    //出栈
    Status Pop(SqStack &s,SDataType &e){
    	//判断是否会发生下溢 
    	if(s.top != s.base){
    		s.top--;    //先将栈顶指针减 1 
    		e = *(s.top);
    	}else{
    		return 0;
    	}
    	return e;
    }
    
    //判断是否为空栈 
    void judgeNull(SqStack &s){
    	if(s.top == s.base){
    		printf("此栈为空栈!\n");
    	}else{
    		printf("此栈不为空栈!\n");
    	}
    }
    
    //判断是否为满栈
    void judgeFull(SqStack &s){
    	if(s.top-s.base == s.StackSize){
    		printf("栈满!\n");
    	}else{
    		printf("栈未满!\n");
    	} 
    } 
    
    int main(){
    	SqStack s;
    	SDataType element;
    	
    	InitStack(s);  //初始化栈
    	//将1-5入栈
    	for(int i=1;i<=10;i++){
    		Push(s,i);
    	}
    	
    	judgeNull(s);
    	judgeFull(s);
    	
    	printf("出栈:\n");
    	//只要栈不为空 
    	while(s.top != s.base){
    		Pop(s,element);    //出栈的元素用e接收 
    		printf("%d ",element);
    	}
    	
    	printf("\n"); 
    	judgeNull(s);
    	
    	return 0;
    	 
    } 
    

    C++中的栈

    C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文件:<algorithm >、<deque >、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。其中的<stack>就是栈。

    C++的STL已经将栈的操作都封装成了函数,我们只需要引进#include<stack>头文件即可使用。

    C++中栈的基本操作

    初始化

    我们可以直接使用stack<int> s;来创建一个空的 stack 对象。

    判断是否为空栈

    使用empty()函数来判断栈是否为空。
    empty()函数详解

    入栈

    使用push()函数来完成入栈操作。
    push()函数详解

    出栈

    使用pop()函数实现出栈
    pop()函数详解

    返回栈顶元素

    使用top()函数返回栈顶元素
    top()函数详解

    返回栈中元素数目

    使用size()函数返回栈中元素的数目。
    size()函数详解


    以上就是C语言和C++中栈的基本用法了,如果你觉得我的文章对你有用请点个赞支持一下吧,如果喜欢我写的文章那么请点个关注再走。
    嘿嘿
    下一篇将继续写数据结构的队列,后续将会再写一些有关栈和队列的具体应用。我是ACfun:一个成长中的程序猿,感谢大家的支持。

    展开全文
  • 最近在做相关的作业,看到三种组织结构形式,就记录一下。 首先,组织的定义是什么? 美国的管理学家巴纳德认为,由于生理上的、心理上的、物质的、社会的限制,人们为了达到个人的和共同的目标就必须合作,于是...
  • 数据结构与算法必知基础知识

    千次阅读 多人点赞 2021-01-06 22:58:12
    数据结构与算法是程序员内功体现的重要标准之一,且数据结构也应用在各个方面,业界更有程序=数据结构+算法这个等式存在。各个中间件开发者,架构师他们都在努力的优化中间件、项目结构以及算法提高运行效率和降低...
  • 3.1.2 双分支结构

    千次阅读 2020-12-06 12:18:10
    3.1.2 双分支结构若条件成立需要执行某些操作,不成立需要执行另外一些操作,则需要编写双分支结构。if 语句与else 语句结合可实现双分支结构。双分支结构的使用格式如下:if表达式:代码块1else:代码块2首先...
  • 数据结构 - 逻辑结构和存储结构

    万次阅读 2017-10-15 22:18:18
    程序=算法+数据结构 N.沃思(Niklaus Wirth)教授提出:  程序=算法+数据结构  以上公式说明了如下两个问题:  (1)算法决定如何构造和组织数据(算法→数据结构)。  (2)算法的选择依赖于作为基础的...
  • 博客文章《完成端口详解》配套代码

    千次下载 热门讨论 2011-10-31 17:50:38
    这份代码是我博客里的文章《完成...当然,作为教学代码,为了能够使得代码结构清晰明了,我还是对代码有所简化,如果想要用于产品开发,最好还是需要自己再完善一下 详情请参见我的博客 http://blog.csdn.net/piggyxp
  • 结构 非常得类似我们之前讲到过的树结构,但前者没有很多的从属关系,更多的是各个数据之间的相关联系。在数学的概念中,后者是前者的一种,不过在数据结构中我们还是认为两者有所区别,尽管如此,我们在学习图...
  • 软件体系结构基础

    千次阅读 2020-12-27 12:57:33
    体系结构的模式选择设计模式做阐述,风格选择典型的三种体系结构风格做阐述,框架选择MVC、J2EE、PCMEF与PCBMER框架做阐述,同时也对特定领域的软件体系结构的类属模型、参考模型,分布式系统结构的多处理机结构、...
  • 【JAVA高级技术】Java 处理结构化数据多种解决方案

    万次阅读 多人点赞 2022-04-23 23:07:18
    Java 处理结构化数据多种解决方案
  • 以二叉链表为存储结构,实现二叉树的创建、遍历 实验要求:在程序中定义下述函数,并实现要求的函数功能: CreateTree():按从键盘输入的扩展前序序列,创建二叉树 PreOrderTree():前序遍历树(递归) In...
  • mysql 树形结构表设计与优化

    千次阅读 2021-09-20 09:15:15
    在诸多的管理类,办公类等系统中,树形结构展示随处可见,以“部门”或"机构"来说,接触过的同学应该都知道,最终展示到页面的效果就是层级结构的那种,下图随机列举了一个部门的树型结构展示图 设计考虑因素 1、表...
  • 逻辑结构与物理结构的区别 算法的特点 常见的数据结构 单链表结构和顺序存储结构的区别 线性链表 数组和链表的区别 判断疫个链表是否有环,如何找到这个环 单链表和双链表的区别 头指针和头结点的区别 简述KMP算法 ...
  • while 循环语法结构

    千次阅读 2020-04-10 08:58:16
    1. while 循环语法结构 while 当...的时候 // while (条件表达式) { // // 循环体 // } // 2. 执行思路 当条件表达式结果为true 则执行循环体 否则 退出循环 // 3. 代码验证 var num = 1; while (...
  • 什么是数据结构

    千次阅读 2019-06-19 20:25:39
    什么是数据结构?数据结构是什么? 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据...
  • Java常见的8种数据结构

    千次阅读 2022-01-25 14:48:57
    数据结构是指数据在计算机内存空间中或磁盘中的组织形式 算法是完成特定任务的过程 二分法查找 r=2^s s:查找步数 r查找范围 幂函数 s=log2® 已知范围获取需要的次数 对数 算法复杂度使用O(N)函数进行标示 主要是...
  • 从今天开始,我将正式开启一个新的打卡专题——【数据结构·水滴计划...完成对数据结构相关知识的全方位复习和巩固;同时还配有专门的笔记总结和文档教程哦!想要搞定,搞透数据结构的同学,欢迎订阅本专栏!.........
  • MySql导出表结构为word文档

    千次阅读 2021-01-18 20:29:23
    connector-odbc-5.1.8-win32导出mysql表结构:DBExportDoc V1.0 For MySQL(MySQL数据库表结构导出器)【DBExportDoc V1.0 For MySQL】是一套用来完成将MySQL数据库中的表结构导出成Word文档,并输出标准的打印报表...
  • 数据结构第一章概论习题及答案

    千次阅读 2020-04-05 12:30:16
    一、名词解释 1.数据表示 2.数据处理 3.数据 4.数据元素 5.逻辑关系 ...6.逻辑结构 ...7.结构 ...10.存储结构 ...11.顺序存储结构 ...12.链式存储结构 ...13.索引存储结构 ...14.散列存储结构 ...18.非形式算法 19....
  • Redis 的hash类型组成:key { field1: value1, field2: value2, field3: value3 ….} Redis的Hash类型实现结构和java中的hashMap一样都是链表数组,以键值对的形式进行存储,又可以和java中的类进行类比以便于理解...
  • 什么是拓扑结构_拓扑结构

    万次阅读 多人点赞 2018-09-09 09:17:01
     首先我们来解释一下拓扑的含义,所谓“拓扑”就是把实体抽象成与其大小、形状无关的“点”,而把连接实体的线路抽象成“线”,进而以图的形式来表示这些点与线之间关系的方法,其目的在于研究这些点、线之间的相连...
  • 常见结构化存储系统架构

    千次阅读 2019-03-01 22:39:24
    结构化数据:一般结构化数据以外的数据,这些数据不存储在数据库中,而是以各种类型的文本形式存放,其中Web上的一些数据(内嵌于HTML或XML标记中)又具有一定的逻辑结构和物理结构,被称为半结构数据。...
  • 数据结构分别为逻辑结构、(存储)物理结构和数据的运算三个部分。 为什么要学数据结构? 首先,因为数据结构作为计算机专业的专业基础课程,是计算机考研的必考科目之一,如果打算报考计算机专业的研究生,你...
  • spring boot项目结构

    千次阅读 2020-12-22 11:13:14
    项目之初,一般我们会根据团队的构成和项目的需求把技术选型、框架定下来,技术选型框架确定后,在团队成员参与开发之前,项目的一些基础服务和组织架构需要资深的负责人或者团队讨论一起分工完成。这样在开始开发后...
  • Java 结构化数据处理开源库 SPL

    千次阅读 多人点赞 2022-03-16 08:08:32
    应用中的业务逻辑大都会涉及结构化数据处理。数据库(SQL)中对这类任务有较丰富的支持,可以相对简易地实现业务逻辑。但Java却一直缺乏这类基础支持,导致用Java实现业务逻辑非常繁琐低效。结果,虽然架构上有各种...
  • 计算机网络体系结构概述

    千次阅读 2021-03-08 13:05:06
    HTTP的作用HTTP基础历史以及层次结构为什么有分层网络模型各层次的功能和协议网站通信的总体过程DNS:负责解析域名HTTP协议:产生请求报文数据应用层协议TCP协议:分割HTTP数据,保证数据运输TCP 三次握手为什么需要三...
  • 数据结构---C++版

    千次阅读 多人点赞 2020-02-11 13:45:11
    1.1 数据结构在程序设计中的作用 1)程序设计的实质是什么? 数据表示:将数据存储在计算机(内存)中 数据处理:处理数据,设计方案(算法) 1.2 计算机求解问题: 1)问题→抽象出问题的模型→求模型的解 问题——...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,026,190
精华内容 410,476
关键字:

一般完成时的结构形式