最优二分检索树

/*************************

程序名称:   最优二分检索树
作成日期:   2018/5/8
作者:     飞翔的女武神
其中树图绘制程序来源于网络

*************************/

#include<iostream>
#include<cstdio>
#include<conio.h>
#include<string>
#include<fstream>

using namespace std;

#define ForMyLove return 0

const int maxn = 2000;

double  chn[maxn];          //某元素的查找代价
double  pref[maxn];         //某段元素的查找代价之和
double  C[maxn][maxn];      //某段元素的平均查找代价
int     R[maxn][maxn];      //某段元素的根
int     tre[maxn];          //树结构

double sumft(int i, int j) {
    return pref[j] - pref[i - 1];
}

string replace(string &s) {
    string ss;
    for (int i = 0; i<s.size(); i++) {
        if (s[i] != '|')ss.append(".");
        else ss.append("|");
    }
    return ss;
}

class Node {
public:
    int  value;
    Node *left;
    Node *right;
    string s;//该节点对应的一行字符串
    int   n;//0、1、2分别代表根节点、左孩子、右孩子

    Node(int value = 0, int n = 0) {
        this->value = value;
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最优二分检索(Optimal Binary Search Tree)是一种经典的数据结构,它是一种可以对键进行搜索的二叉,且中每个节点都有一个与之关联的数值,通常是一个键值和一个权值。它的主要特点是查询的时间复杂度为O(logn),效率非常高。同时,它可以通过动态规划的方法,构建出一棵,使得所有的查找操作所需的时间最小。 在C语言中,实现最优二分检索可以使用动态规划算法进行构建。其基本思路是:先按照给定的键值和权值构造一颗二叉搜索,然后计算出每个节点对应子的最小搜索代价,并选择最小代价来构造最优二分检索。通过动态规划的方法,可以将时间复杂度优化到O(n^3)。 下面是一个简单的C语言实现示例: ```c #include <stdio.h> #include <stdlib.h> #define MAX_N 100 int n; double p[MAX_N + 1]; // 数组p存储每个关键字被搜索到的概率 double q[MAX_N + 1]; // 数组q存储每个虚拟节点(即没有关键字)被搜索到的概率 double w[MAX_N + 1][MAX_N + 1]; // 数组w存储子i-j的概率和 double e[MAX_N + 1][MAX_N + 1]; // 数组e存储子i-j的最小代价 double root[MAX_N + 1][MAX_N + 1]; // 数组root存储子i-j最优二分检索的根节点 void optimal_bst() { for (int i = 1; i <= n + 1; i++) { w[i][i - 1] = q[i - 1]; e[i][i - 1] = q[i - 1]; } for (int len = 1; len <= n; len++) { for (int i = 1; i <= n - len + 1; i++) { int j = i + len - 1; e[i][j] = __DBL_MAX__; w[i][j] = w[i][j - 1] + p[j] + q[j]; for (int k = i; k <= j; k++) { double t = e[i][k - 1] + e[k + 1][j] + w[i][j]; if (t < e[i][j]) { e[i][j] = t; root[i][j] = k; } } } } } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%lf", &p[i]); q[i] = q[i - 1] + p[i]; } q[n + 1] = q[n]; optimal_bst(); printf("最小代价为:%lf\n", e[n]); printf("最优二分检索的根节点为:%lf\n", root[n]); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值