数据结构

一.用递归的算法编写出对存入在 a[n+1]数组中的 n 个有序元素进行二分(又称折半)查找(假定 a[0]单元不用)的程序。

int halfsearch(SSTable *a, KeyType k,int low,int high)

#include <iostream>

using namespace std;



int halfsearch(int arr[], int low, int high, int x) {

    if (high >= low) {

        int mid = low + (high - low) / 2;



        if (arr[mid] == x)

            return mid;



        if (arr[mid] > x)

            return halfsearch(arr, low, mid - 1, x);



      

        return halfsearch(arr, mid + 1, high, x);

    }

  

    return -1;

}



int main() {

    int arr[] = { 23, 34, 45, 60, 100 };

    int n = sizeof(arr) / sizeof(arr[0]);

    int x = 100;

    int result = halfsearch(arr, 0, n - 1, x);

    (result == -1) ? cout << "元素不存在"

        : cout << "元素位于数组的索引位置 "

        << result;

    return 0;

}

二.某公司计划要在北京、上海、广州、深圳、成都、昆明、西安这5个城市之间设计旅游路线,出发地和返回地均为北京,查询城市之间的里程,绘制里程图,试为他们设计一条行走路线,使得行走路线尽可能短。尝试提高程序的效率。(不要求考虑使用的交通工具)。

基本思路:

为了设计行走路线,需要先得到城市之间的里程,并且计算最短路径,可以使用Dijkstra最短路径算法来解决。5个城市之间可以用有向图来表示,每个城市是一个节点,边权重是两个城市之间的距离。

以下是解决这个问题的步骤:1.获取城市之间的距离。2.采用Dijkstra最短路径算法计算行走路线。首先需要初始化一个距离数组和标记数组,距离数组存储从起点出发到其他节点的距离,标记数组用来记录节点是否被访问过。然后选择一个起点,将其加入已访问的集合,更新与其相邻的节点的距离数组和标记数组。重复这个过程,直到所有节点都被访问过或者找到了终点。3.绘制里程图和行走路线

源码:

#include <iostream>

#include <vector>



using namespace std;



const int INF = 1000000000;



vector<vector<int>> adj_matrix = {

    {0, 1254, 1777, 1885, 1426, 2121, 1213},

    {1254, 0, 1548, 1203, 2234, 2233, 1079},

    {1777, 1548, 0, 1432, 3068, 2859, 1408},

    {1885, 1203, 1432, 0, 2690, 3034, 933},

    {1426, 2234, 3068, 2690, 0, 1361, 2706},

    {2121, 2233, 2859, 3034, 1361, 0, 2254},

    {1213, 1079, 1408, 933, 2706, 2254, 0}

};



int main()

{



    vector<bool> visited(7, false);

    visited[0] = true;



    int total_distance = 0;

    int curr_city = 0;



    cout << "路线: ";

    for (int i = 0; i < 6; ++i) {

        int min_distance = INF;

        int closest_city = -1;

      

        for (int j = 0; j < 7; ++j) {

            if (!visited[j] && adj_matrix[curr_city][j] < min_distance) {

                min_distance = adj_matrix[curr_city][j];

                closest_city = j;

                cout << curr_city << " -> " << closest_city << ", ";

                total_distance += min_distance;

                visited[closest_city] = true;

                curr_city = closest_city;

            }

            cout << endl << "总距离: " << total_distance << "米" << endl;



            return 0;

        }

    }

}

运行结果截图:

四.分析现有大型搜索引擎(如百度、谷歌)所使用的排序算法,对比分析同一问题所得到的排序结果差异性。进一步思考现有排序算法可能存在或带来的问题,并提出初步的解决方案。

现有大型搜索引擎(如百度、谷歌)所使用的排序算法:对于现有大型搜索引擎(例如百度和Google),它们在进行搜索时,会先将用户的查询解析为一个查询语句,然后根据一系列排序算法来对匹配的网页进行排序,并将排名靠前的结果呈现给用户。目前主流的排序算法有:PageRank算法,百度Rank算法,基于TF-IDF算法和BM25算法的文本匹配算法,用户行为算法等。

对比分析同一问题所得到的排序结果差异性:搜索引擎所使用的排序算法包含多种因素,比如搜索关键词、网站排名、页面质量等。这些因素都会影响搜索引擎的排序结果,尤其当关键词的竞争度高时,结果差异性可能会更加显著。另外,搜索引擎不断地更新优化其算法,以提高搜索结果质量和用户体验,这也会导致搜索结果的差异。

可能存在或带来的问题,并提出初步的解决方案,如下:

1.搜索结果出现重复内容

解决方案:通过去除重复词汇等手段降低重复数据的权重。

2.垃圾信息过多

解决方案:消费者可以通过报告垃圾信息帮助去除最明显的垃圾信息。而搜索引擎本身也可以采用人工审核和自动检测等方法对即未被发现垃圾信息进行查找和删除。

3.人工干预因素

解决方案:采用先进的机器学习算法和自然语言处理技术,以检测和消除搜索算法中的人类错误和偏见。

4. 偏向大品牌或常见内容

解决方案:搜索引擎可以采用更加公正的排序算法,根据网页内容和互联网上链接的数量来评估其排名。

5.无法处理短期内产生的新兴话题

解决方案:“实时”排序问题可以采用基于机器学习和NLP技巧的增加搭配实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值