话说“查找”

高效查找算法:顺序查找与二分查找对比

         在日常生活中,人们几乎每天都要进行"查找".例如,在电话号码薄中查找某单位或某人的电话号码,在字典中查阅某个词的读音和含义等.查找的关键问题是如何快速地到待查的内容,例如,查字典的关键是如何快速地确定待查之字在字典的哪一页.对于浩如烟海的计算机中的数据,有相当多的数据时以数组的形式组织与存放的,以数组的形式组织和存放数据的数据结构被称为顺序表.对于顺序表的查找,人们已经发明了许多种算法,典型的有顺序查找和二分(折半、对半)查找。

         顺序查找是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。 这种查找的效率相对较低。

        我们来看一个例子,

import java.util.Scanner;

public class Search{

public static int[] Data =

         {

     1,7,9,12,15,

     16,20,32,35,57,

     78,80,83,89,90,

     92,97,108,120,177

   };

public static int Counter = 1;

public static void main(String args[]){

int n;

 

    System.out.println("Please enter your key value:");

Scanner console = new Scanner(System.in);

int KeyValue = console.nextInt();

if(Seq_Search((int)KeyValue)){

   //输出查找次数

   System.out.println("");

   System.out.println("Search Time = " + (int)Counter);

   n=(int) Counter-1;

  System.out.println("所查整数在数组中的位置下标是:" + n);

}

else{

//输出没有找到的数据

   System.out.println("");

   System.out.println("NO Found!!!");

}

}

//顺序查找

public static boolean Seq_Search(int Key){

    int i;//数组下标变量

for(i = 0; i < 20; i++){

   System.out.print("[" + (int)Data[i] + "]");

   //查找到数据时

   if((int)Key == (int)Data[i])

     return true;//返回true

   Counter++;

  

}

return false;//查找不到,返回false

}

}

输出的结果:

        在这个例子中,我们看到查找120这个元素,需要查找19次,特别的麻烦。那么我们来看看二分查找吧。

 

            二分查找是在一个有序表(数组)是由其值由小到大或由大到小依次存放的,这里我们以值由小到大排序为例)中,每次都将待查值与中间的那个元素比较,若相等则查找成功,否则,调整查找范围,若中间那个元素的值小于待查值,则在表的后一半中查找,若中间那个元素的值大于待查值,则在表的前一半中查找;如此循环,每次只与一半中的一个元素比较,可使查找效率大大提高。

        我们以一个例子来看看:

//设数组中的数值是由小到大存放的,编写二分查找程序

import java.io.*;

class FindSearch

{

   int binarySearch(int arr[],int searchValue)

     {

         int low=0; //low是第一个数组元素的小标

         int high=arr.length-1;

         int mid=(low+high)/2;

         while(low<=high && arr[mid]!=searchValue)

          {

             if (arr[mid]<searchValue)

                 low=mid+1; //要找的数可能在数组的后一半部分中

             else

                 high=mid-1;//要找的数可能在数组的前半部分中

              mid=(low+high)/2;

           }

           if (low>high)mid=-1;

           return mid; //mid是数组元素下标,若为-1,则表示不存在要查的元素

    }

}

 

public class seek

{

   public static void main(String[] args)throws IOException

     {

        BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));

        int i,k,search,mid;

        String c1;

        int arr[]={2,4,7,18,25,34,56,68,89};

        System.out.println("打印原始数据");

        for(i=0;i<arr.length;i++)

        System.out.print(" "+arr[i]);

        System.out.println("\n");

        System.out.println("请输入要查找的整数");

        c1=keyin.readLine();

        search=Integer.parseInt(c1);  //取出字符串转换为整型数赋给search

        FindSearch p1=new FindSearch();

        mid=p1.binarySearch(arr,search);

        if(mid==-1)

            System.out.println("没找到!");

        else

            System.out.println("所查整数在数组中的位置下标是:"+mid);

     }

}

 

 

输出的结果为:

 

我们以查找68为例的二分查找的比较和下标调整过程:

 

<think>好的,用户需要的是用上海话表达天气变化的句子,具体例子是“天边来了一片云落了一场雨天气很好”。首先,得理解用户的需求,他们可能想学习上海话中描述天气的常用表达,或者想用方言更生动地描述天气变化。需要先确认上海话中常用的词汇和句式结构。接下来,得分析用户提供的句子结构。原句分为两部分:前半部分描述天气变化(云来了,下雨了),后半部分说天气很好。可能需要注意上海话中的语序和用词差异,比如动词的位置、量词的使用等。例如,“一片云”在上海话中可能会用“一朵云”或者不同的量词。 然后,考虑上海话的发音和用词习惯。比如“天边”在上海话中可能说“天浪向”或者“天旁边”,“落雨”是常用的说法。需要确保翻译后的句子符合上海话的表达习惯,而不仅仅是直译普通话。 还需要查找是否有现成的上海话教材或网络资源中的类似例句,确认常用的表达方式。比如,上海话中常用“落雨”而不是“下雨”,“天气好”可能会说“天气老好”或者“天气赞”。另外,要注意句子的连贯性,确保前后部分衔接自然。比如前半部分描述下雨,后面说天气好,可能需要适当的转折词,或者根据实际情况调整,比如雨后的晴朗。最后,整合这些信息,形成符合上海话语法和用词习惯的句子,并检查是否自然流畅。可能需要多个版本,供用户选择。同时,考虑是否需要添加注音或拼音,帮助用户正确发音。完成翻译后,按照用户要求生成相关问题,这些问题应围绕上海话的天气表达、语法结构或日常用语,确保相关且有助于用户进一步学习。</think>根据上海话的表达习惯和语法特点,"天边来了一片云落了一场雨 天气很好"可转换为以下两种常见表述方式: **1. 天浪向飘过来一朵乌云,落脱一埭雨,现在天气倒蛮嗰** - "天浪向"对应普通话"天边" - "落脱一埭雨"中"埭"(da)是上海话特有量词 - "倒蛮嗰"表示转折语气 **2. 天旁边飘来块黑云头,落仔阵头雨,过脱一歇歇天又放晴了** - "阵头雨"指雷阵雨 - "过脱一歇歇"表示"过了一会儿" - "放晴"使用动词+补语结构 上海话语法特点: 1. 量词使用差异:"片"对应"朵/块" 2. 时态表达:"落仔"(落了)包含完成时态 3. 倒装结构常见:"落雨哉"代替"下雨了" 发音要点: - "嗰"读作[geʔ](短促入声) - "埭"读[da](阳去声) - "歇"读[xɪʔ](入声) ``` # 上海话拼音示例 tin lang xiang piao kwe wu yun deu 天 浪向 飘 块 乌 云 头 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弯_弯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值