精华内容
下载资源
问答
  • VB程序中可以用split函数检索所需要的字符串,在Transact-SQL中可以用CHARINDEX 函数在指定字符串检索需要的字符串。 示例: declare @s varchar(1000) declare @t varchar(1000) set @s='"GL","AAA","04/01/...
    在VB程序中可以用split函数检索所需要的字符串,在Transact-SQL中可以用CHARINDEX 函数在指定字符串中检索需要的字符串。
    示例:
    declare @s varchar(1000)
    declare @t varchar(1000)

    set @s='"GL","AAA","04/01/2008","001:02:37","0","C","CLOAM","CLOA","C","","A","D","0800-000-410104","0800-000-410100",240340,"000025","M-25-080204-08","090","M","4685.00","4660.00","M-DQ102-066","","","",""'

    set @t='"CLOA"'

    select LEFT(RIGHT(@S,LEN(@S)-CHARINDEX(@t,@S)+1),len(@t))
     
    其中
    select CHARINDEX(@t,@S)
    语句检索@t字符串在@s中第一次出现的位置。
     
    注:以下内容来至SQL SERVER2005联机丛书。在博客中复制下来为了记忆而已。
     
    CHARINDEX 和 PATINDEX 函数都返回指定模式的开始位置。PATINDEX 可以使用通配符,而 CHARINDEX 不能。
    这两个函数都带有两个参数:
    • 希望获取其位置的模式。使用 PATINDEX,模式是可以包含通配符的文字字符串。使用 CHARINDEX,模式是不包含通配符的文字字符串。

    • 字符串值表达式(通常为列名),SQL Server 2005 在其中搜索指定的模式。
    一、语法

    备注

    如果 pattern 或 expression 为 NULL,则当数据库的兼容级别为 70 时,PATINDEX 将返回 NULL;如果数据库兼容级别小于或等于 65,则仅当 pattern 和 expression 同时为 NULL 时,PATINDEX 才返回 NULL。
    PATINDEX 基于输入的排序规则执行比较。若要以指定排序规则进行比较,则可以使用 COLLATE 将显式排序规则应用于输入值。

    参数

    pattern
    一个文字字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个或最后一个字符时除外)。pattern 是字符串数据类型类别的表达式。
    expression
    一个表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别。

    返回类型

    如果 expression 的数据类型为 varchar(max) 或 nvarchar(max),则为 bigint,否则为 int。

    示例

    A. 在 PATINDEX 中使用模式

    以下示例查找模式 ensure 在 Document 表的 DocumentSummary 列的某一特定行中的开始位置。
    如果未通过 WHERE 子句限制要搜索的行,查询将返回表中的所有行,对在其中找到该模式的所有行报告非零值,对在其中未找到该模式的所有行报告零值。

    B. 在 PATINDEX 中使用通配符

    以下示例使用通配符查找模式 en_ure 在 Document 表中 DocumentSummary 列的某一特定行中的开始位置,其中下划线为代表任何字符的通配符。
    如果没有限制要搜索的行,查询将返回表中的所有行,对在其中找到该模式的所有行报告非零值。

    C. 在 PATINDEX 中使用 COLLATE

    以下示例使用 COLLATE 函数显式指定要搜索的表达式的排序规则。
    复制代码
    
    
    
    
    
    
    CHARINDEX ( expression1 ,expression2 [ , start_location ] )

    备注

    如果 expression1 或 expression2 之一是 Unicode 数据类型(nvarchar 或 nchar)而另一个不是,则将另一个转换为 Unicode 数据类型。CHARINDEX 不能与 text、ntext 和 image 数据类型一起使用。
    如果 expression1 或 expression2 之一为 NULL,并且数据库兼容级别为 70 或更高,则 CHARINDEX 将返回 NULL。如果数据库兼容级别为 65 或更低,则 CHARINDEX 将仅在 expression1 和 expression2 都为 NULL 时才返回 NULL 值。
    如果在 expression1 内找不到 expression2,则 CHARINDEX 返回 0。
    CHARINDEX 将根据输入的排序规则执行比较操作。若要以指定排序规则进行比较,则可以使用 COLLATE 将显式排序规则应用于输入值。

    参数

    expression1
    一个表达式,其中包含要查找的字符的序列。expression1 是一个字符串数据类别的表达式。
    expression2
    一个表达式,通常是一个为指定序列搜索的列。expression2 属于字符串数据类别。
    start_location
    开始在 expression2 中搜索 expression1 时的字符位置。如果 start_location 未被指定、是一个负数或零,则将从 expression2 的开头开始搜索。start_location 可以是 bigint 类型。

    返回类型

    如果 expression2 的数据类型为 varchar(max)、nvarchar(max) 或 varbinary(max),则为 bigint,否则为 int。
     
     


         本文转自fengyp 51CTO博客,原文链接:http://blog.51cto.com/fengyp/73343,如需转载请自行联系原作者



    展开全文
  • Forcal用多键值字符串键树保存和检索数据信息,可以用Forcal保存和检索任意类型的数据,存储效率高,且具有很高的查找效率。 Forcal有许多内置的基本函数(一级函数和二级函数),不过可以使用(C/C++)、Delphi、...
  • 接受单一的字符串(Command), MATLAB将运行命令及结果作为一个字符串返回。用于执行一个合法的MATLAB命令; (2) PutFullMatrix方法 void PutFullMatrix pr, [in] SAFEARRAY pr, [in] SAFEARRAY pi ) 将一个...
  • VB.NET机房收费系统之正则表达式

    热门讨论 2017-12-08 20:19:19
    正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 在VB.NET中使用正则表达式必须先引入命名空间System.Text....
        正则表达式,又称正规表示法、常规表示法,计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

        在VB.NET中使用正则表达式必须先引入命名空间System.Text.RegularExpressions,该命名空间包含一下七个类:Regex、Match、MatchCollection、GroupCollection、CaptureCollection、Group、Capture。Regex类表示不可变(只读)正则表达式类,设置待匹配字符串的模式。Match类表示正则表达式匹配操作的结果。MatchCollection 类表示成功的非重叠匹配的序列,即匹配后得到的字符串集合。在正则表达式中应用最多的就是这三个类。

        下面就VB.NET应用实例来说明正则表达式对输入框的内容限制:

        首先,是在模块中封装正则表达式定义过程。

    Imports System.Text.RegularExpressions
    Module Module1
    
        Public Const C_REGULAR_NumLimit = "^\d{0,9}$"           '只能输入0~9的数字的正则表达式  
        Public Const C_REGULAR_Chinese = "^[\u4e00-\u9fa5]{0,}$"  '只能输入汉字的正则表达式  
    
    
        ''' <summary>
        ''' 检测输入字符串是否匹配正则表达式项  
        ''' </summary>
        ''' <param name="strPattern"></param>
        ''' <param name="TextReg"></param>
        ''' <returns></returns>
        Public Function funCheckRegular(ByVal strPattern As String, TextReg As String)
            Return Regex.IsMatch(TextReg, strPattern)
        End Function
    
        ''' <summary>
        '''  具体执行的判断函数,判断是否输入数字 
        ''' </summary>
        ''' <param name="arrayControl"></param>
        ''' <param name="strPattern"></param>
        ''' <param name="Warning"></param>
        ''' <returns></returns>
        Public Function CheckRegular(ByVal arrayControl() As Term, ByVal strPattern As String, Warning As String) As Boolean
            Dim termControl As Term                                      '声明一个Term类型变量termControl    
            '遍历结构体数组中的所有元素,如果控件文本输入不合法,则给出相应返回值    
            For Each termControl In arrayControl                         '遍历结构体数组中所有元素    
                If TypeOf termControl.controlSub Is TextBox Then         '判断控件是否为文本框    
                    If termControl.controlSub.Text.Trim <> "" Then       '判断文本框内容是否为空,不为空往下执行    
                        If funCheckRegular(strPattern, termControl.controlSub.Text) = False Then
                            MessageBox.Show(termControl.controlSub.Text + "栏 - -!" + Warning, "友情提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
                            termControl.controlSub.Focus()       '为空控件得到焦点    
                            Return False
                            Exit Function
                        End If
                    End If
                End If
            Next
            Return True
        End Function
        ''' <summary>
        ''' 定义结构体
        ''' </summary>
        Public Structure Term
            Dim controlSub As Control
            Dim strText As String
            Sub New(ByVal controlSub As Control, ByVal strText As String)
                With Me
                    .controlSub = controlSub
                    .strText = strText
                End With
            End Sub
        End Structure
    
        ''' <summary>
        ''' 定义Term类型的结构体数组
        ''' </summary>
        Public arrayControl() As Term
        Dim Panel As Control
    End Module
    
    
         然后,在编辑的窗体中重定义两个数组,实例化Term结构体数组,再在需要的时候调用它。

    Public Sub Rdim()  
          ReDim Preserve arrayControl(4)  '重定义数字数组维数    
          '初始化数组    
          arrayControl(0) = New Term(txtCardNo, "卡号")  
          arrayControl(1) = New Term(txtCash, "充值金额")  
          arrayControl(2) = New Term(txtStudentNo, "学号")  
          arrayControl(3) = New Term(txtGrade, "年级")  
          arrayControl(4) = New Term(txtClass, "班级")  
      
      End Sub  
      Public Sub RdimStrNum()  
          ReDim Preserve arrayControl(1)  '重定义字符数组维数    
          '初始化数组  
          arrayControl(0) = New Term(txtDepartment, "系别")  
          arrayControl(1) = New Term(txtName, "姓名")  
      End Sub  
    '判断用户输入是否合法(数字)。  
           Call Rdim()  
           Dim strPattern = C_REGULAR_NumLimit        '正则表达式    
           Dim Warning As String = "只能输入0-9个数字"  
           If CheckRegular(arrayControl, strPattern, Warning) = False Then  
               Exit Sub  
           End If  
           '判断用户输入是否合法(汉字)。  
           Call RdimStrNum()  
           Dim pattern = C_REGULAR_Chinese    '正则表达式    
           Dim Warn As String = "只能输入汉字"  
           If CheckRegular(arrayControl, pattern, Warn) = False Then  
               Exit Sub  
           End If  

    小结:正则表达式的特点是:1. 灵活性、逻辑性和功能性非常的强;2. 可以迅速地用极简单的方式达到字符串的复杂控制。

         刚开始接触正则表达式,以后要多多学习。

         
           




    展开全文
  • 作者:python来源:SegmentFault 思否社区正则表达式用来处理字符串,对字符串进行检索和替换,另外正则在python爬虫的应用也是相当广泛!特点灵活性、逻辑性和功能性非常强可以迅速地用极简单的方式达到字符串的...
    作者:python来源:SegmentFault 思否社区
    正则表达式用来处理字符串,对字符串进行检索和替换,另外正则在python爬虫的应用也是相当广泛! 特点
    • 灵活性、逻辑性和功能性非常强 
    • 可以迅速地用极简单的方式达到字符串的复杂控制

    正则语法

    `# 1、数字和字母都表示它本身, . 表示匹配除了换行以外的任意字符,    . 表示匹配 .
    # 2、很多字母前面添加  会有特殊含义
        - n:换行
        - t:制表符
        - d: 匹配数字,等价[0-9]
        - D:非数字,等价于[^0-9]
        - w:表示数字、字母以及下划线,中文,等价于[0-9a-zA-Z_]
        - W:表示w取反
        - s:表示任意的非打印字符(空格、换行、制表符)
        - S:表示非空白字符
    # 3、绝大多数标点都有特殊含义
        - ():用来表示一个分组,如果需要表示括号,需要使用 
        - []: 匹配范围,[0-9] 表示0~9范围中的一个,[0-9a-zA-Z]
        - |: 表示或者的意思 re.search(r'f(x|y|z)m','pdsfxm')   匹配fxm
        - {},{2,},{,3},{1,3}:用来限定前面元素出现的次数  re.search(r'go{2}d''good')
        - *: 表示前面的元素出现的次数为0次及以上,等价于{0,}
        - +: 表示前面的元素出现的次数为1次及以上,等价于{1,}
        - ^:以指定的内容开头,或者取反的意思
        - $:以指定的内容结尾
    # 4、 ? 的两种用法
        - 规定前面元素出现的次数最多只能出现1次,等价于{,1}
        - 将贪婪模式转换为非贪婪模式(重点)` 


    re模块的介绍

    XM返佣 https://www.fx61.com/brokerlist/xm.html该模块是python中专门用于处理正则的默认,提供了相关的方法

    常用方法

    • match、search 只查询一次

    • finditer 查找到所有的匹配数据放到一个可迭代对象中

    • findall 把查找到的所有字符串结果放到一个列表中

    • fullmatch 完全匹配,字符串需要满足正则表达式

    Match类的使用

    调用re.match,re.search或者对re.finditer的遍历返回的对象都是re.Match对象

    Match类的属性和方法

    • pos、endpos 被查找字符串的起始和终端位置
    • span( ) 匹配到的下标位置(元组)
    • group 分组的概念
    `import re

    m = re.search(r'c.*z''abcdefgz')
    print(m.pos)  # 0
    print(m.endpos)  # 8
    print(m.span())  # (2, 8)
    # 使用group获取获取到匹配的字符串
    print(m.group()) # cdefgz

    # group表示正则表达式的分组
    # 1、在正则表达式里使用()表示一个分组
    # 2、如果没有分组,默认只有一组
    # 3、分组的下标从0开始

    # 这里有4个分组 
    m1 = re.search(r'(1.*)(2.*)(3.*4)''a1bcd2efgh3ij4k')
    print(m1.group())  # 默认就是第0组  1bcd2efgh3ij4
    print(m1.group(0))  # 第0组就是把整个正则表达式当做一个整体  1bcd2efgh3ij4
    print(m1.group(1))  # 1bcd
    print(m1.group(2))  # 2efgh
    print(m1.group(3))  # 3ij4

    #  groups() 将分组以元组的形式返回
    print(m1.groups())  # ('1bcd', '2efgh', '3ij4')

    # (?P 表达式) 给分组取个名字
    m2 = re.search(r'(?P1.*)(?P2.*)(?P3.*4)''a1bcd2efgh3ij4k')
    print(m2.groupdict())  # {'one': '1bcd', 'two': '2efgh', 'three': '3ij4'}` 

    • compile 在re模块,可以使用re.方法调用函数,还可以调用re.compile得到一个对象
    `import re

    # 这两种写法没有区别
    m = re.search(r'm.*a''111m22222a')
    print(m)  

    m2 = re.compile(r'm.*a')
    result = m2.search('111m22222a')
    print(result) # ` 


    正则修饰符

    正则修饰符是对表达式进行修饰
    • re.I 使匹配对大小写不敏感
    • re.M 多行匹配,影响 ^ 和$
    • re.S 使 . 匹配包括换行在内的所有字符
    `import re

    # . 表示除了换行以外的任意字符
    x = re.search(r'm.*a''abcdmonxxxa')
    print(x)  # None

    # re.S 匹配换行
    y = re.search(r'm.*a''abcdmonxxxa', re.S)  # 让 . 匹配换行
    print(y)

    a = re.search(r'x''helloXyz')
    print(a)  # None
    # re.I 忽略大小写
    b = re.search(r'x''helloXyz', re.I)
    print(b)  

    # re.M 让$ 匹配到换行
    m = re.findall(r'w+$''i am boyn you are girln he is man')
    print(m)  # ['man']
    n = re.findall(r'w+$''i am boyn you are girln he is man', re.M)
    print(n) # ['boy', 'girl', 'man']` 


    正则替换

    sub
    `import re

    # 把数字替换成x
    m = re.sub(r'd''x''hello123wor123ld')
    print(m)  # helloxxxworxxxld

    n = re.sub(r'd+''x''hello123wor123ld')
    print(n) # helloxworxld

    # 需求:将p中内容的数字乘2
    p = 'hello50good34'
    def test(x):
        y = int(x.group(0))
        y *= 2
        return str(y)  # 这里只能以字符串的形式返回

    print(re.sub(r'd+'test, p)) # hello100good68` 

    贪婪模式与非贪婪模式

    在正则表达式里,默认采用的是贪婪模式,尽可能匹配多的字符串 在贪婪模式后面添加?,可将贪婪模式转化为非贪婪模式
    import re

    m = re.search(r'm.*a''abcm123a456a')
    print(m)  # m123a456a,这里为什么不是m123a呢?因为这里默认使用的贪婪模式
    n = re.search(r'm.*?a''abcm123a456a')
    print(n)  # m123a    使用?将贪婪模式转化为非贪婪模式

    # ?
    print(re.match(r'aa(d+)''aa123bb456').group(1))  # 123
    print(re.match(r'aa(d+?)''aa123bb456').group(1))  # 1
    print(re.match(r'aa(d+?)''aa123bb456').group(0))  # aa1

    # 虽然说是尽可能少的匹配,但也要满足匹配呀
    print(re.match(r'aaa(d+)ddd''aaa2333ddd').group(0))  # aaa2333ddd
    print(re.match(r'aaa(d+?)ddd''aaa2333ddd').group(1))  # 2333

    print(re.match(r'aaa(d+).*''aaa2333ddd').group(0))  # aaa2333ddd
    print(re.match(r'aaa(d+?).*''aaa2333ddd').group(1))  # 2

    - END -

    c4c68716048d29af930da2bacc6e1697.png

    a49c94980764bde147cae2e3e585fcb2.gif

    展开全文
  • 将词典看成单一字符串的压缩方法 按块存储 前端编码 倒排记录表的压缩 可变字节编码VB编码 gamma 编码 索引压缩:对词典和倒排记录表这两个数据结构进行压缩。 为什么需要压缩? 使用更少的磁盘空间 ...

    索引压缩

    目录

    索引压缩

    为什么需要压缩?

    两种压缩方式:

    信息检索中词项的统计特性

    Heaps定律

    Zipf定律

    词典压缩

    用定长数组来存储词典中的词项。

    将词典看成单一字符串的压缩方法  

    按块存储

    前端编码

    倒排记录表的压缩

    可变字节编码VB编码

    gamma 编码


     

    索引压缩:对词典和倒排记录表这两个数据结构进行压缩。

     

    为什么需要压缩?

    1. 使用更少的磁盘空间

    节省资金

    1. 在内存中存放更多信息

    提高速度

    1. 提高数据从磁盘传输到内存的速度

    读取压缩数据|解压缩 比 读取未压缩数据 快得多

    前提:解压缩算法是高效的

     

    词典尽可能全部放在内存中,如果放不下,

    倒排表没有办法全部放在内存中,把查询最多的词项的倒排表放在内存。

     

    词典:

    1. 使其足以存放在内存中
    2. 使内存可以多容纳一些倒排记录表

    倒排记录表:

    1. 减少所需的磁盘空间
    2. 减少从磁盘中读取倒排记录表所需的时间
    3. 大型搜索引擎将一部分倒排记录表保存在内存中(压缩使内存能保存更多的倒排记录表)

     

     

    两种压缩方式:

    无损压缩:所有原始信息都保留(大多数IR系统的做法)

    有损压缩:大小写转换,词干还原,停用词...

    会造成一定的信息丢失,但是有时候对检索没影响

     

     

    信息检索中词项的统计特性

    1. 词项的个数:Heaps定律
    2. 词项在文档出现的次数,有的词项出现的多,有的词项出现的次数少:Zipf定律

    文档集频率:一个词项在文档集中总共出现次数

    文档频率:一个词项在几个文档中出现,倒排索引一部分。

    区别:词A中文档1中出现了3次,文档频率只算1个,但文档集频率算3

     

    Heaps定律

    词项数目的估计

    • Heaps’ 定律: M = kTb
    • M 是词汇表大小, T 是文档集中的词条个数
    • 参数k和b的典型取值为: 30 ≤ k ≤ 100 b ≈ 0.5
    • Heaps定律认为,在对数空间中词汇量 M T,存在线性关系

     

    Zipf定律

    对词项分布的建模

    自然语言中存在一些高频词项,也存在一些极低频词项

    • Zipf’s 定律: 排名第i多的词项的文档集频率与1/i 成正比.
    • cfi文档集频率: 文档集中排名第i多的词项的文档集频率.
    • cfi ∝ 1/i = K/i K 是一个常量
    • 如果出现最多的词项的出现次数是cf1的话
      • 出现第二多的词项的出现次数就是 cf1的一半
      • 出现第三多的词项出现次数是cf1的1/3 …
    • 等价变换: cfi = K/i ,其中k=1, 因此
      • log cfi = log K - log i
    • log cfi log i 线性关系

     

     

     

    词典压缩

    定长数组(浪费空间)——长字符串(完全不浪费空间)——按块存储(继续减少词项指针占的空间)——       前端编码

    定长数组(浪费空间,11.2MB)——长字符串(完全不浪费空间,7.6MB)——按块存储(继续减少词项指针占的空间,7.1MB)——前端编码(5.9MB)

    用定长数组来存储词典中的词项。

    ——浪费空间。词项没那么长,为了存储很长的单词为每个词项使用同样大的小存储空间。

     

    terms:词项,每个词项采用20个字节来存储。

    Freq:文档频率(查询优化使用,也要存储),4个字节

    postings ptr:倒排表指针,4个字节

    词典需要存储词项文档频率倒排表三部分,压缩重点在词项上。

    每个词项用20个字节浪费。

    about:占6个   computer:占9个  20个:有些词项太长

    初始时直接设20个,为了容纳很 长的单词,为每个词项都 安排了20个字节

    缺点:浪费空间,一般单词都没20个那么长

    例子

    定长数组这种方法花多少空间来存储400K个词项

    每个词项需要存三部分(词项本身20,文档频率4,倒排表指针4)

    400K

    0.4M*(20+4+4)=11.2MB

    做实验:先用小数据集来做实验,再应用到大型的数据集。

    单词的平均长度为8字节。

     

     

     

     

    将词典看成单一字符串的压缩方法  

      1. 为每个词项增加一个定位指针,它在指向下一词项的指针同时也标识着当前词项的结束
      2. 这种机制能够节省大约60% 的存储空间.

    长字符串:将所有单词连接(没有结束符)

    定长数组(浪费空间)——长字符串(完全不浪费空间)aboutcomputerinformation...

    虽然不浪费空间,但是新问题,如何分隔长字符串(引入一个指针Term ptr,词项指针)

    词项指针:指示词项位置在哪,花多少字节存储?

    词项个数:400K*8就是长字符串的总长度

    词项指针花多少字节表示。

     

    长字符串指针所需的存储空间:

    • 文档频率采用4 B存储.
    • 词项到倒排记录表的地址指针也采用4 B存储.
    • 词项指针采用3 B存储
    • 词项字符串中每个词项平均为8 B
    • 400K 词项 x 19 Þ 7.6 MB (定长数组总共需要 11.2MB)

     

    计算机是二进制。。

    举例:8个数据(0~7),用几个二进制位表示,计算方法 log8(以2为底)

    000

    001

    010

    011

    100

    101

    110

    111

    同理,3.2MB的数据,用几个二进制位表示,log3.2M(以2为底)

    bits:位

    bytes:字节

    1个字节8位

    22位,转换为字节,24位用3个字节表示。

    计算机以字节为单位处理比较快,以位处理很慢。

    本例中,词项指针可以用3个字节来表示

    长字符串的方法,占多少空间

    400K

    每个词项:词项本身8、文档频率4、倒排表指针4,词项指针3

    0.4M*(8+4+4+3)=7.6MB

     

    从定长数组:11.2MB转换为长字符串方法变成了7.6MB

     

     

     

     

    按块存储

    • 将长字符串的词项进行分组变成大小为k的块(即k个词项).
      • k=4 为例.
    • 需要存储每个词项长度 (长度用1B表示)
    • 块指针依然是3字节

    思想方法:按块存储,把词项指针减少,分块,每个块有块指针,块内没指针如何间隔,在每个词项前存一个长度

     

    长字符串与按块存储(减少指针)    :

    如果是长字符串方法 ,每4个词项有4个词项指针占12字节

    如果是按块存储,每4个词项,1个块指针3字节+4个长度4字节,总共7字节

     

    举例:

    400K个词项,0.4M

    每个词项(词项本身8、文档频率4、倒排表指针4,词项长度1),每个块的块指针3字节

    0.4M*(8+4+4+1)+0.4M*3/4=0.4M*17+0.3M=7.1MB  k=4为例

    按块存储,可以减少存储空间

    一个块中有4个词项(k=4):0.4M*(8+4+4+1)+0.4M*3/4=0.4M*17+0.3M=7.1MB

    一个块中有8个词项(k=8):0.4M*(8+4+4+1)+0.4M*3/8=6.8M+0.15M=6.95MB

    一个块中有16个词项(k=16):0.4M*(8+4+4+1)+0.4M*3/16=6.8M+0.075MB=6.875MB

     

    k如果增大,压缩率更高,我们不会去增大K

    平均比较次数:

    1. 使用块之后,平均比较次数变多(检索效率变低)
    2. 为了在压缩和检索效率之间平衡,k不能太大
    3. 按块存储了为了压缩,k越大,平均比较次数增多(检索变慢)
    4. 词典是B+(二叉搜索树),平均比较次数
    5. 使用块:块外是二叉搜索树,块间是线性

    不使用块的词典检索平均比较次数为2.6

    使用块的词典检索平均比较 次数为3

     

     

    前端编码

    前端编码:公共前缀被识别出来后,后续的词项可以使用一个特殊的字符来表示这段前缀

     

     

     

     

    倒排记录表的压缩

     

    每个倒排记录表用文档id表示

    思路:文档id之间的间距不大,可以选择用间距来表示

    数值越小,所需的存储空间越少

    举例:文档id 33 47 154 159 202

    使用间距33 14 107  5  43

     

     

     

    倒排表的两种极端:

    每个文档id用20个位存储

    高频词:花20位存储,浪费空间。

    低频词/罕见词:很少出现,花20位存储。

     

     

    为了对间距进行空间压缩:

    1.按字节压缩:对间距采用最短字节的方式进行编码

    VB编码——根据间距的大小采用合适的字节进行编码

    2.按位压缩:按位方式进行编码

    Gamma编码——在更细的位粒度上进行编码长度的自适应调整

    可变字节编码VB编码

    VB(variable byte可变字节)编码:根据间距的大小采用合适的字节进行编码

     

    思想:

    1. 字节的后七位是间距的有效编码区
    2. 间距使用整数字节进行编码。
    3. 每个字节的第一位延续位标识着本次编码的结束(1)与否(0)
    4. 一个字节有8位

     

    编码:

    1. 转二进制
    2. 从低位(右边)每7位间隔
    3. 每7位补成8位,如果是最低字节(最右边)补1,否则全部补0直到8位

     

     

    824的可变字节码如何计算

    1.转二进制

    1100111000

    2.从低位(右边)每7位间隔

    110  0111000

    3.每7位补成8位,如果是最低字节(最右边)补1,否则全部补0直到8位

    00000110 10111000

     

    214577

    1.转二进制

    110100011000110001

    2.从右边开始,每7位间隔

    1101  0001100  0110001

    3.最右一个字节最高位补1,剩下的全部补0到8位

    00001101  00001100  10110001

     

    每个间距花不同的字节数来存储,824用了2字节,214577用了3字节

    只好用每个字节的最高位(延续位,区分字节的范围)来表示这个间距结束了没有

    延续位如果为0,表示后面还是当前间距的字节,如果为1,后面不是当前间距,是下一个间距。

     

    00000110  10111000  10000101  00001101  00001100 10110001

     

    第一个间距的VB编码表示:00000110 10111000

    第二个间距的VB编 码表示:10000101

    第三个间距的VB编 码表示:00001101 00001100 10110001

     

    一个字节本来有8位,最高位变成了延续,实际的数值,只在后7位。

    在VB编码中,最高位是延续位(不是间距的数值),后7位才是间距的数

    00000110 10111000

     

     

     

    (一)给一个倒排表:824 829 215406,编码

    1.先求间距:824 5 214577

    2.一个一个的求VB编码

    824

    00000110 10111000

    5:后面没了,最高位一定要1,中间的补0

    10000101

    214577

    00001101 00001100 10110001

    3.把上面的全部连起来

    000001101011100010000101000011010000110010110001

     

    (二)如何还原?解码

    给一串VB编码:000001101011100010000101000011010000110010110001

    题目:还原为原来的倒排表

    1.每8个分一下(人阅读方便,程序没有这个步骤)

    00000110 10111000 10000101 00001101 00001100 10110001

    2.分出来每个间距对应的VB编码,从左往右看,分出三个间距

    00000110 10111000

    10000101

    00001101 00001100 10110001

    3.将每个间距的VB编码还原为整数的间距,切出每个字节的低7位,连接,转十进制。

    (a)

    00000110 10111000  最高位不能算(延续位),

    00001100111000

    (b)

    10000101取低7位得5

    (c)00001101 00001100 10110001

    000110100011000110001

    每个字节取低7位,连接,转十进制,得214577

    4.得到间距

    824 5 214577

    5.转为原始的倒排表

    824 829 215406

     

     

    十进制为例:

    4568,取低两位,4568%pow(10,2)  mod

    45689411220,取低7位,45689411220%pow(10,7)

    要取低7位,mod pow(10,7)

    二进制,取低7位

    n mod pow(2,7)

    n mod 128就是取低7位。

    128本身是pow(2,7)

    mod 128:模128   %  取余数

    div 128:除128   /  整数除

    1457  取低2位  1457%100(除100的余数,模),57

    1457  1457/100(整数除),得到14,相当于把低2位去掉。

    十进制:div pow(10,2),相当于十进制,相当于把低2位去掉

    二进制:div pow(2,7),相当于把低7位去掉

    十进制,取低n位,模pow(10,n)

    二进制,取低n位,模pow(2,n)

    二进制取低7位,除以pow(2,7),模128

    n mod 128,取n的低7位

    7个位7个位处理,处理完下一组低7位。

     

     

     

    算法:

    可变字节编码

    VB编码 variable byte:

    VBDecode(bytesstream):bytessteam:字节流

    00000110 10111000 10000101 00001101 00001100 10110001——字节流

     

    128:10000000

    1.numbers:放最终结果,初始化为空

    2.n:一个个解码,解完后添加到numbers

    3.遍历字节流中的每一个字节

    4.判断每一个元素是否<128,判断最高位是0还是1

    5.<128

    6~7.>128 

     6. -128相当于把最高位的1去掉(最高位是延续位,又不是数据,)

     7.把求完的结果append往后加到numbers中

     8.把n置0,用于求下一个数

    9.返回最终结果

     

    将字节流中的8位,转换成数字

     

    '1457'将字符串转换为整数

     

    n=0

    循环:1

     

    n=10*n+i

    1.  n=10*0+1=1

    2.  n=10*n+4=14

    3.  n=10*n+5=140+5=145

    4.  n=10*n+7=145*10+7=1457

     

     

     

     

    十进制乘10

    n=0

    00000110 10111000 10000101 00001101 00001100 10110001

     

    n=128*0+00000110=00000110

    n=128*(00000110)+(10111000-10000000)

     

    1100000000

    0000111000

     

    1100111000

     

    128*二进制,相当于后面多了7个0

     

    可变字节编码,以字节为单位。

     

     

     

     

     

    gamma 编码

    • 位方式编码可以得到更高的压缩率
      • Gamma编码是最著名的.
    • 将间距 G 表示为长度和偏移
    • G的偏移实际上是G的二进制表示去掉了前端的1
      • 例13 → 1101 → 101
    • 长度指的是偏移的长度
      • 例13 (偏移 101), 长度是3.
    • 长度采用一元编码: 1110.
    • 13的Gamma编码是长度与偏移的连接: 1110101

    特性:

    • G 编码使用了 2 ëlog Gû + 1 bits
      • 偏移的长度是ëlog Gû bits
      • 长度的长度是 ëlog Gû + 1 bits
    • g编码的长度永远都是奇数位
    • 与最优编码长度log2 G只相差一个因子2
    • g编码是前缀无关的,即一个g编码不会是另一个g编码的前缀.
    • g编码适用于任意分布

     

     

     

     

    不常用:

    • 机器有字长限制– 8, 16, 32, 64 bits
      • 跨越机器字的操作非常缓慢
    • 可变字节编码基于字节,因此比g编码更加高效
    • 如不考虑效率,可变字节编码比g编码消耗的磁盘空间更大一点

    按位操作,很慢

    按字节操作,很快

    尽量按字节操作

    按位有可能更节省空间,变慢。

    折中,压缩率高?速度?

     

    倒排表压缩:可变字节编码(以字节为单位,最少也要使用一个字节进行存储)/Gamma编码(按位存储,最低可以只用1~2位存储,压缩率更高)

     

    1

    可变字节:10000001,需要8位表示1

    Gamma编码:0,需要1位表示1

     

    一元编码是Gamma编码的一部分。

     

    824 5 214577

     

    5的偏移01

     

    00

     

    101

     

    偏移:转二进制,最高位1去掉

    1的偏移:转二进制为1,也要去掉最高位

     

     

    13:

    先求偏移:转二进制最高位1去掉101

     

    偏移:101

    长度:偏移的长度,3,用一元编码1110

     

    Gamma编码:长度连接偏移1110101

     

    24:

    偏移:1000

    长度:4,一元:11110

    结果:111101000

     

    2:

    偏移:0

    长度:1,一元:10

    连接:100

     

    1:

    偏移:没有

    长度:0

    连接:0

     

    以字节操作:快

    不是以字节/按位操作:慢

     

     

    展开全文
  • 正则表达式测试工具 for vb6

    万次阅读 2011-01-15 13:41:00
    正则表达式测试工具,当然也可以做为一般数据处理工具。 ...接着就在下面输入正则表达式,点击下面按钮处理检索结果。...完全匹配:测试字符串是否和内容匹配,返回True或者False 检索结果:对表达式开始处理,输
  • 展开全部条形码作为一e68a...当某件物品上带有的条形码被条码扫描器正确解读后,将会得到该物品的唯一标识字符串,通过检索数据库我们就可以很容易知道它的一些其它属性并作相应处理。虽然在Int...
  •  'Substring为检索子字符串,从后面的参数位置开始;LastIndexOf("\")为检索标志  sfile = paths(i - j).Substring(paths(j).LastIndexOf("\") 1) '获取歌曲名称  Dim mitem As New ListViewItem(count 1 j) '...
  • VB中的对象--关于Dictionary

    千次阅读 2007-05-23 23:05:00
    Dictionary 保存数据键和项目对的对象。说明Dictionary 对象与 PERL 关联...键值用于检索单个项目,通常是整数或字符串,但不能为数组。下面代码示范如何创建 Dictionary 对象: Dim d 创建一个变量。Set d = CreateO
  • 微软 VB2010 源码包

    2013-05-22 02:21:18
    StringFormatting:演示如何使用各种特定于区域性的标准及自定义格式代码将数字值、日期/时间值和枚举值显示为字符串 Strings:演示如何使用 String 方法 TryCatch:演示如何使用 Try...Catch...Finally 在应用...
  • 查询语句的解释

    千次阅读 2013-08-24 20:11:46
    关于这条代码我想解释一下: txtsql = "select * from user_info where user_ID= '" &username & "'" 意思我就不解释了,直接...双引号是给VB用的,里面是字符串.检索数据库的时候是需要语句的,要包含在字符串里面. &
  • 8.2.1 日期时间函数 8.2.2 CONVERT函数转换日期、时间 8.2.3 数据运算函数 8.3 字符串函数 8.3.1 字符串处理函数介绍 8.3.2 字符转换函数 8.3.3 去字符串空格函数 8.3.4 取字符串长度的函数 8.3.5 查询包含部分字符...
  • 精通正则表达式(中英)

    热门讨论 2011-09-08 13:18:58
    字符串,字符编码和匹配模式 101 作为正则表达式的字符串 101 字符编码 105 正则模式和匹配模式 110 常用的元字符和特性 113 字符表示法 115 字符组及相关结构 118 锚点及其他“零长度断言” 129 注释和模式量词 135...
  • MYSQL中文手册

    2013-03-11 21:21:34
    8.14. replace:字符串替换实用工具 8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2....
  • 8.14. replace:字符串替换实用工具 8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、...
  • 8.14. replace:字符串替换实用工具 8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、...
  • 实例050 利用变量查询字符串数据 105 实例051 利用变量查询数值型数据 107 实例052 利用变量查询日期型数据 108 3.5 模式查询 110 实例053 在Jet SQL语法中使用通配符 110 实例054 在SQL Server中用通配符“%”...
  • 实例050 利用变量查询字符串数据 105 实例051 利用变量查询数值型数据 107 实例052 利用变量查询日期型数据 108 3.5 模式查询 110 实例053 在Jet SQL语法中使用通配符 110 实例054 在SQL Server中用通配符“%”...
  • DLL函数查看器V3.5

    热门讨论 2013-07-24 10:10:37
    2.按粘帖键(Ctrl+V)将剪辑板中字符串在列表中匹配查找. 3.关于参数量的问题,由于猜解方法过于简单对于部分函数未从当前函数返回,而是"JMP"到别的函数 所以猜解可能会有错误,需要结合已知函数库或反汇编查看,另此...
  • 3、组件的开发和使用很方便:如ASP的组件是由C++,VB等语言开发的,并需要注册才能使用;而JSP的组件是用Java开发的,可以直接使用; 4、一次编写,处处运行:作为JAVA开发平台的一部分,JSP具有JAVA的所有优点,...
  • Oracle事例

    2007-08-26 10:35:53
    23、如何在字符串里加回车或者tab键 在sqlplus中执行 sql>select \'UserId=1233111\'||chr(10)||\'AccId=13431\'||chr(9)||\'AccId2=11111\' from dual; 24、树形查询 create table zj( bm number(8), bmmc...
  • vc++ 应用源码包_1

    2012-09-15 14:22:12
    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
  • vc++ 应用源码包_4

    2012-09-15 14:38:35
    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
  • vc++ 应用源码包_3

    2012-09-15 14:33:15
    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序...
  • asp.net知识库

    2015-06-18 08:45:45
    .NET 2.0中的字符串比较 小试ASP.NET 2.0的兼容性 为 asp.net 2.0 的菜单控件增加 target 属性 ASP.NET 2.0 的内部变化 常见的 ASP.NET 2.0 转换问题和解决方案 Asp.Net2.0无刷新客户端回调 体验.net 2.0 的优雅(1...
  • 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...

空空如也

空空如也

1 2
收藏数 32
精华内容 12
关键字:

vb字符串检索