线性搜索目标

Posted

技术标签:

【中文标题】线性搜索目标【英文标题】:Linear searching for a target 【发布时间】:2017-04-22 01:45:55 【问题描述】:

作为我课堂上编码挑战的一部分,我们必须编写代码来提供 10 种不同的任务。

在此任务中,我的目标是创建一个线性搜索算法,在数组中搜索特定项目,如果找到则显示其位置。

这是我当前的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Linearsearch2

    class Program
    
        static void Main(string[] args)
        
            var array = new int[]  1, 31, 10, 9, 420, -5, 77, 420, 300, 99 ; //Sets up the array

            var targetvalue = 77; //Establishes what number the search will attempt to find.
            var targetpos = -1; //Establishes the position in the array of the target.
            var targetnumber = 0; //Establishes the counter for the number of times the target appears.
            bool found = false; //Decides wether to change the number or use a counter method.

            var foundpositions = new int[]  ; //Establishes an array which will hold the positions of located items

            for (var i = 1; i < array.Length; i++)
            
                if (found == true && array[i] == targetvalue)
                
                    targetnumber = targetnumber + 1;
                

                if (found == false && array[i] == targetvalue) //If the target value has not been found yet
                
                    foundpositions.Add(i); //This is the line i need help with. I dont know how to add a value to an array properly.
                    found = true;
                
            

            if (targetpos != -1) //If the target number was found
                Console.WriteLine("The number " + targetvalue + " appeared " + targetnumber + " times, at positions " + foundpositions + "."); // Prints the final outcome.
            
            else //If the target number was not found
            
                Console.WriteLine("The number " + targetvalue + " did not appear in this array."); // Prints the final outcome.
            
        
    

我需要帮助的问题是第 31 行, foundpositions.Add(i);

我不知道正确向数组添加值的行,这似乎是导致问题的原因。 (在这一行中,我试图将搜索的当前位置添加到稍后将显示的数组中)

感谢您的帮助。此外,如果有任何其他明显的、明显的错误,请指出它们,我们将不胜感激。

【问题讨论】:

您能解释一下为什么要检查是否找到目标吗?这似乎没有必要。 【参考方案1】:

我需要帮助的问题是第 31 行, foundpositions.Add(i);

数组不是动态的,它们没有add() 方法。你可以改用List

替换这个:

var foundpositions = new int[]  ;

用这个:

var foundpositions = new List<int>();

另外,你似乎没有对这个声明的变量做任何事情:

var targetpos = -1;

因此控制将永远进入这个if块:

if (targetpos != -1) //If the target number was found
      Console.WriteLine("The number " + targetvalue + " appeared " + targetnumber + " times, at positions " + foundpositions + "."); // Prints the final outcome.

在这个任务中,我的目标是制作一个线性搜索算法 在数组中搜索特定项,并显示其 位置(如果找到)。

您的代码目前看起来似乎有几个错误。但是,下面的示例将帮助您入门:

public static int LinearSearch(int[] items, int target)

       if (items == null) throw new ArgumentNullException("argument items has null reference");
       if (items.Length == 0) return -1; // return -1 if the item is not found
       for (int i = 0; i < items.Length; i++)
            if (items[i] == target) return i;
       return -1; // return -1 if the item is not found

然后只需在 main 方法中调用 LinearSearch 并传入所需的数据即可。

不要忘记将 LinearSearch 的返回值分配给变量,或者直接将其打印到控制台。

【讨论】:

【参考方案2】:

我不确定您为什么要检查是否找到目标号码。如果您想获取与目标 int 相等的所有 int 的数组中的索引,那么您可以简单地遍历数组并将匹配项放入 int 列表中,然后返回此列表。

这个返回列表的计数将告诉您有多少匹配目标,并且列表将包含这些匹配的索引。似乎没有任何理由在遍历数组时检查是否找到了目标。如果返回的列表为空,则未找到目标。下面的代码使用了这种方法。我希望我没有遗漏什么。

private static void FindTargets() 
  var array = new int[]  1, 31, 10, 9, 420, -5, 77, 420, 300, 99, 1, 31, 10, 9, 420, -5, 77, 420, 300, 99 ; //Sets up the array
  int target = 77;
  List<int> foundTargets = GetPositions(target, array);
  StringBuilder sb = new StringBuilder();
  sb.Append("There are " + foundTargets.Count + " int(s) that match " + target + Environment.NewLine);
  sb.Append("The array indexs for the target ints " + target + " are: ");
  int count = 0;
  foreach (int curInt in foundTargets) 
    sb.Append(curInt);
    if (count < foundTargets.Count - 1)
      sb.Append(", ");
    count++;
  
  Console.WriteLine(sb.ToString());


private static List<int> GetPositions(int target, int[] intArray) 
  List<int> foundTargets = new List<int>();
  for (int i = 0; i < intArray.Length; i++) 
    if (intArray[i] == target) 
      foundTargets.Add(i);
    
  
  return foundTargets;

【讨论】:

以上是关于线性搜索目标的主要内容,如果未能解决你的问题,请参考以下文章

线性搜索数组

向后递归线性搜索

单元测试线性搜索方法

组装:我的线性搜索代码有问题

数据结构与算法之四 搜索算法

Scikit 网格搜索参数(不是超参数)