使用数组实现快速数据查找

如何使⽤C#中的集合实现对集合元素的快速查找和查找复杂度分析? 在使用哈希表时,为自定义类型提供高效的。 阅读详情

在很多数据库应用程序中,需要通过一个关键字段找出对应的其它字段数据,并且要求查找速度快。如在大多数的监控程序中,从终端获得一个标识后,需要通过这个标识将数据表中的其它数据查询出来,并显示在程序界面上。一般的做法是直接使用SQL查询返回查询结果。其实如果这个标识是唯一有序的,并且返回的结果也是唯一的,就没必要频繁地查询数据库。应该将数据首先存入内存,当然数据行上万就有难度。我要讲的存入内存其实是采用最为简单的方式,也就是记录(结构)类型作元素的数组。

具休做法是,先定义一个记录类型,用于保存在界面中要显示的结果数据,再定义一个数组,将所有数据从数据表是查询并排序存入这个数组。在查找时使用二分法得到对应的数组元素。

具体代码如下:

unit u_MyData;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Dialogs, StdCtrls, DB;

type
  PMyData = ^TMyData;
  TMyData = record
    CardNo: Integer;
    EmpNo, EmpName, ClassName: String;
  end;

  TMySearch = class
  private
    { Private declarations }
    List: Array of TMyData;
    function Search(iBegin, iEnd, ACardNo: Integer): Integer;
  public
    { Public declarations }
    destructor Destroy; override;
    function Clear: Boolean;
    function LoadValue(Items: TStrings): Boolean; overload;
    function LoadValue(DataSet: TDataSet): Boolean; overload;
    function SearchFor(ACardNo: Integer): TMyData; overload;
  end;

var
  NULL_DATA: TMyData;

implementation

{ TMySearch }

function TMySearch.Clear: Boolean;
begin
  Result:= False;
  try
    SetLength(List, 0);
    Result:= True;
  except
    // Can't free the element.
  end;
end;

destructor TMySearch.Destroy;
begin
  Clear;
  inherited;
end;

function TMySearch.LoadValue(DataSet: TDataSet): Boolean;
var
  i: integer;
begin
  Result:= False;
  try
    Clear;      // Clear the old value first.

    with DataSet do
    begin
      if Active then
      begin
        DisableControls;
        try
          SetLength(List, RecordCount);

          First;
          for i:= 0 to RecordCount -1 do
          begin
            List[i].CardNo:= Fields[0].AsInteger;
            List[i].EmpNo:= Fields[1].AsString;
            List[i].EmpName:= Fields[2].AsString;
            List[i].ClassName:= Fields[3].AsString;
            Next;
          end;
        finally
          EnableControls;
        end;
      end;
    end;
  except
    // Can't load value from dataset.
  end;
end;

function TMySearch.LoadValue(Items: TStrings): Boolean;
var
  i: integer;
begin
  Result:= False;
  try
    Clear;      // Clear the old value first.
   
    SetLength(List, Items.Count);
    for i:= 0 to Items.Count -1 do
    begin
      List[i].CardNo:= StrToInt(Items[i]);
    end;
    Result:= True;
  except
    // Can't load value from strings.
  end;
end;

function TMySearch.Search(iBegin, iEnd, ACardNo: Integer): Integer;
var
  Mid: Integer;
begin
  Result:= -1;
  try
    if iBegin <= iEnd then
    begin
      Mid:= (iBegin + iEnd) div 2;
      if List[Mid].CardNo = ACardNo then
        Result:= Mid
      else if List[Mid].CardNo > ACardNo then
        Result:= Search(iBegin, Mid -1, ACardNo)
      else
        Result:= Search(Mid + 1, iEnd, ACardNo);
    end;
  except
    // Can't search the value.
  end;
end;

function TMySearch.SearchFor(ACardNo: Integer): TMyData;
var
  i: integer;
begin
  Result:= NULL_DATA;
  try
    if Length(List) > 0 then
    begin
      i:= Search(0, Length(List) -1, ACardNo);
      if (i >= 0) and (i < Length(List)) then
        Result:= List[i];
    end;
  except
    // Can't find a value.
  end;
end;

end.

{ 以一个类实现 } 
以上代码经测试,只是感觉上比查询数据库快,实际还得设定相同条件进行比较。

C#实现在数组中快速查找近似值 (附完整源码) 阅读详情

相关推荐

最大数组合

给定一个整数的二维数组,由其中若干邻近元素构成的矩形称为子数组。请编程计算所有子 数组元素之和的最大值。

数组查找,返回其索引位置(可有重复)

// 随机10个数,键盘输入一个元素,查找并返回它对应的索引值,可有重复数字 import java.util.Arrays; import java.util.Scanner; public class Demo { public static void main(String[] args) { System.out.println(Arrays.toString(arr)); S...

后来阿的博客 4422

易语言数组中数值的查找源码-易语言

易语言数组中数值的查找源码

数组-二维数组中的查找

题意: 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ] 给定 target = 5,返回 true。 给定 t

muyu_muyu的博客 635

易语言数组中数值的查找

易语言数组中数值的查找源码,数组中数值的查找

巨量千川M-API实战:5分钟搞定短视频计划数据自动获取(Python版)

本文详细介绍了如何利用巨量千川M-API和Python快速搭建自动化工具,实现短视频计划数据的自动获取。通过实战代码演示了从环境准备、Token管理到核心数据接口调用的完整流程,帮助电商运营和技术开发者告别手动导出,高效完成数据汇总与分析。

weixin_29325515的博客 1359

js 数组方法总结(快查)

9.findIndex((item,index,arr)=>{}),查找数组中第一个满足条件的元素,并返回该元素的索引,没有返回-1。20.数组的成员有时还是数组, Array.flat() 用于将嵌套的数组拉平, 变成一维的数组.参数决定拉平几层,默认一层。6.arr.splice(),可对数组进行增删改操作. 此方法改变数组,返回被删除的元素组成的一个数组, 没有则返回空数组。8.find((item,index,arr)=>{}),查找数组中第一个满足条件的元素,并返回该元素。

dddgddd的博客 280

OpenBCI脑电帽硬件DIY与低成本搭建实战

本文详细介绍了如何通过第三方兼容硬件和开源设计,低成本DIY一套功能完备的OpenBCI脑电采集系统。从硬件选购、组装、软件配置到信号调试,提供了完整的实战指南,将总成本控制在千元级别,使脑机接口技术对爱好者、学生和研究者变得更加触手可及。

weixin_29322855的博客 788

易语言查找文本数组里相同文本源码

这实际上就是我们前面说的删除数组重复成员的的一种方法,我们在加入数组前,先删除重复文本,在把一些文本加入数组或者数据库时,不想加入重复相同的文本,那么我们可以封装一个子程序来过滤一下文本, 易语言删除除数组重复成员的源码 易语言删除数组里的指定成员的三种方法 .版本 2 .子程序 查找相同文本 .参数 文本数组, 文本型, 数组 .参数 输出文本, 文本型, 数组 .局部变量 文本数量, 整数型 .局部变量 加入文本数量, 整数型 .局部变量 是否存在, 逻辑型 .计次循环首 (取数组...

511遇见 5727

飞书多维表格+影刀RPA:我如何用3个指令搞定每周的销售数据自动汇总(附完整配置截图)

本文详细介绍了如何利用飞书多维表格和影刀RPA实现销售数据的自动化汇总,通过三个核心指令(建立链接、列出记录、更新记录)简化繁琐的手工操作。文章包含完整的配置截图和实战指南,帮助用户快速部署自动化流程,提升工作效率。

weixin_29273849的博客 285

使用RustDesk或者AnyDesk的TCP隧道实现Codesys系列PLC的远程调试和下载

Codesys远程调试

exat500g的博客 7274

HBU训练营——二分查找 (15分)(利用二分查找找出所给出的数在数组中的下标)

利用二分查找找出所给出的数在数组中的下标 输入格式: 第一行输入n和m表示数组有n个数据,m表示要对m个数进行查找 输出格式: 所有输出在一行完成,行末没有多余空格和多余回车。 输入样例: 5 5 1 2 3 4 5 1 2 3 4 5 输出样例: 0 1 2 3 4 分析:我刚开始居然真的用了二分查找,emmm我觉得挺麻烦的,可能是思路或者方法不太好,测试数据也过了,但是提交不通过,找了半天,也不知道哪里错了,网上搜了搜测试点,发现了更好的方法,对,然后我毅然决然地换了方式,这好像不太好。。。。。

xxxibgdrgn博客 4905

OTP语音芯片SOP8的前世今生_如九齐_硕呈_钰绅等以及国产方案KT148A

语音芯片ic的其中一个品类,就是SOP8封装的OTP语音芯片,非常的经典和常用。源头的供应商基本都是台系的原厂,比如:九齐、硕呈、佑华等等,其中佑华就算是鼻祖了,早期的4位机也是在语音市场得到了升华。 OTP(One Time Programmable)是单片机的一种存储器类型,意思是一次性可编程:程序烧入单片机后,将不可再次更改和清除。

qyvhome的博客 1873

数组练习-新建二维数组,对其进行排序,并查找某一数字在数组中的下标

数组练习 新建二维数组,对其进行排序,并查找某一数字在数组中的下标 package com.jl.learning; import java.util.Arrays; //新建二维数组,对其进行排序,并查找某一数字在数组中的下标 public class ArrayTest9 { public static void main(String[] args) { int[] array = {5,6,8,51,61,861,601,65}; Arrays.sort(

Jiangh3293的博客 143

BUCK-BOOST升降压电路Multisim电路仿真分析

本文分析了三极管型BUCK-BOOST升降压开关电源的工作原理。该电路结合了BUCK降压和BOOST升压拓扑,通过控制三极管Q1的高频通断,使电感L1周期性储能和释能,实现输出电压可高于或低于输入电压且极性相反。详细阐述了Q1导通和关断阶段的工作过程,推导了输出电压与占空比的关系式Vo=-D/(1-D)*Vi,并分析了不同占空比下的工作模式(降压、升压)。通过Multisim仿真验证了理论分析,当D=25%时输出降压至1.6V,D=60%时输出升压至7.5V。电路具有升降压灵活、极性反转、效率高等特点,适用

XU157303764的博客 1436

直流母线电压采集与缓冲调理电路

本文介绍了一种直流母线电压采集与缓冲调理电路的设计与应用。该电路通过电阻分压网络将高压直流母线电压降至适合ADC采样的范围,并采用运放电压跟随器实现高输入阻抗和低输出阻抗的缓冲功能,有效提高采样精度和抗干扰能力。文章重点阐述了低输出阻抗对驱动负载、抗干扰和电压稳定的重要性,并列举了该电路在工业电源监测、电动汽车BMS、通信电源和储能系统等领域的典型应用场景。

qq_37999850的博客 319

顺序表的顺序查找和折半查找

顺序查找: #include <iostream> using namespace std; int SeqSearch(int r[],int n,int k) { r[0]=k;//下标0用作哨兵存放要查询的数 int i=n; while(r[i]!=k)//不用判断下标i是否越界 { i--; } return i...

Andrelia的博客 4927

基于UC3842的反激电源的全面深入解析与MATLAB仿真

内置电流检测,可实现电流模式控制,提高系统的动态响应性。多种保护功能,如欠压锁定、过温保护、短路保护等,确保系统的安全可靠运行。宽工作电压范围,适应不同的电源设计需求。简单的外部元件配置,易于实现。UC3842的典型应用包括开关电源、DC-DC转换器和反激式电源等,其稳定性和可靠性在实际应用中得到了广泛验证。

qq_38334677的博客 1086

数组的查找删除操作

二分查找(折半查找): 前提时有序数组 递归查找: public class WorkTest { public static void main(String []args) { int []a =new int [] {1,2,3,4,5,9,10,44,33,66,44,55}; System.out.println("输入要查找的数"); Scanner x= new Scanner(System.in); int m=x.nextInt(); int end=a.length-1

qq_45841224的博客 409

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

巧用C语言数组实现数据的高效存储与管理

它采用分治思想,选择一个基准元素,将数组分为两部分,使得左边部分的元素都小于基准元素,右边部分的元素都大于基准元素,然后分别对左右两部分进行递归排序。通过循环读取文件中的字符,并将其存储到数组中,实现对文本的高效处理。通过巧妙运用数组进行数据存储,结合合适的数据管理策略,以及优化数组的使用方式,能够显著提升程序的性能和效率,为开发高质量的C语言程序奠定坚实基础。2. 减少不必要的访问次数:在处理数组时,尽量减少对同一元素的重复访问,通过合理的数据处理逻辑,一次性完成对数组元素的必要操作。

cloudman08的博客 689

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

数据结构-查找-插值查找法

插值查找法 插值查找法又叫做插补查找法,是二分查找法的改进版。它是按照数据位置的分布,利用公式预测数据所在的位置,再以二分法的方式渐渐逼近。使用插值法是假设数据平均分布在数组中,而每一项的差距相当接近或有一定的距离比例。插值法的公式为: Mid = low + ((key - data[low]) / (data[high] - data[low])) * (high - low) 其中Key是要查找的键值,data[high],data[low]是剩余待查找记录中的最大值和最小值,假设数据项为n,其插值查

weixin_46429290的博客 2156

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

查找两个数组的相同字符(两个超大文件的相同字符)

1.找到两个数组中的相同元素 数组A 数组B 方法1:对A中的数组进行排序,采取同样的排序方法对B中的数组进行排序 1)从A,B中各自取出a,b进行比较 2)如果a>b,那么从B中取出下一个数据b进行比较   3)如果a<b,那么从A中取出下一个数据a进行比较 4)如果a=b,那么找到一个,继续 方法2:hash   1...

weixin_30745553的博客 992

java 实现快速筛选_Java实现的快速查找算法示例

本文实例讲述了Java实现的快速查找算法。分享给大家供大家参考,具体如下:快速查找算法,可以根据想要找的是第几个大的数,每次循环都能固定下来一个数在数组完整排完序之后的位置,每次循环都能定一个数的位置,如果当前固定的数的位置和用户要找的第几个数匹配,则就直接返回。例如我要找第二大的数,如果循环一次固定的数的下标是1,那就是当前需要找的数。代码如下:// 快速查找算法public static in...

weixin_29201313的博客 754

【STL】利用map快速查找vector

可以使用vector动态数组来存储原始信息,当需要查找的时候如果直接查找的话要一个一个的从头开始遍历,效率较低,借助map的键值对的特点,我们可以利用map来建立索引。 实现方法:在建立vector的同时,也同时将该元素插入到map容器中,map的first是待查找的关键字,second是该元素在vector中的下标。 如果是在导入数据时建立map,可以按照下面这样写: vector.push_back(element); mapname.insert(make_pair(element.getSname(

SuperSources的博客 1209

机试题 查找

输入描述: 输入有多组数据。 每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。 输出描述: 如果在n个数组中输出YES否则输出NO。 示例1 输入 5 1 5 2 4 3 3 2 5 6 输出 YES YES NO 解题思路: #include <stdio.h> #include <stdlib....

毛毛的博客 284

北京邮电大学 查找(java)

题目描述 输入数组长度 n 输入数组 a[1...n] 输入查找个数m 输入查找数字b[1...m] 输出 YES or NO 查找有则YES 否则NO 。 输入描述: 输入有多组数据。 每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。 输出描述: 如果在n个数组中输出YES否则输出NO。 示例1 输入 复制 5 1 5 2 4 3...

weixin_43306331的博客 345
上一篇: 数据库设计中的多对多关系与一对多关系
下一篇: TDBCtrlGrid如何使用?
CableFan
博客等级 码龄25年 21粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值