linux - 如何在 Bash 中进行内存中的二进制搜索?

标签 linux bash search binary

<分区>

编写一个 bash 脚本来进行二进制搜索。将文件中的学生姓名和成绩读入数组。提示用户输入学生姓名。在数组中查找名称并显示成绩。文件中的数据如下:

Ann:A
Bob:C
Cindy:B
Dean:F
Emily:A
Frank:C
Ginger:D
Hal:B
Ivy:A
Justin:F
Karen:D

我已经完成了以下操作,但我不知道下一步该做什么

#!/bin/bash
 echo "please enter students Name: "
 read student
 echo "$student + $Grade"
 ((i=0))
 while read students[$i] ; do
 ((i++))

 done < students.dat
 first=0
 last=$(students[@])


 ((mid=0))
 Name=`echo ${students[$mid]} | cut -d: -f1`
 Grade=`echo ${students[$mid]} | cut -d: -f2`
 echo $Name
 echo $Grade

最佳答案

这里的每个人都希望你学习这些东西而不是为你做作业,所以我故意有点迟钝。

请记住,这里提出的任何解决方案都是一个程序员的做法,不一定是唯一正确的方法。

您需要先将您的成绩纳入您的类(class) - 从这开始。 文件中的每一行都是一个学生姓名,与成绩之间用“:”分隔。 您想将它们读入两个并行数组(正如 Jonathan 指出的那样)。

如果您在 google 上搜索“bash split string”,您会发现很多关于如何执行此操作的有用建议。 我这样做是为了得到两个数组,一个保存学生姓名,另一个保存成绩。

((i=0))
while IFS=":" read -a fields ;
do
    students[$i]=${fields[0]}
    grades[$i]=${fields[1]}

    ((i++))
done < students.dat
echo ${students[@]}
echo ${grades[@]}

太棒了!现在您需要稍微研究一下二分查找算法。请记住,您可以使用 ${#ArrayName[@]}

获取数组的长度

由于列表显然已经排序,您不必自己进行排序,因此您可以将所需的姓名与数组中点的学生姓名进行比较。如果你要找的学生姓名大于中点的学生姓名,那么你就知道你要找的在数组的后半部分,反之亦然。最终中点的学生姓名将正是您要查找的那个。

关于linux - 如何在 Bash 中进行内存中的二进制搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22056855/

相关文章:

javascript - 使用 Jquery 搜索 - 适用于多个术语

linux - 打开文件中的每个路径并在每个文件中搜索模式

Bash 求和 5 位数字

linux - Bash 脚本 : bad interpreter

linux - 将多个 PDF 文档转换为多个图像文件

linux - Grep 命令需要解释

ios - 命令行中的 Xcode .mobileprovision 文件可以是 'installed' 吗?

php - 如何知道一个命令已执行并完成执行另一个命令(ssh - php)

node.js - 无法运行 mongodb2.4 文本搜索

linux - 如何判断脚本是否以 super 用户身份运行?