Trie图

#include <iostream>    //The standard IO stream
#include <sstream>      //The standard String library and string stream
#include <cstring>    //The C-style string library
#include <cassert>    //The C-style assert library
#include <climits>    //For using "INT_MIN"

#define MAXNUM 26   //The max num of the children of a node
using namespace std;    //using the standard namespace "std"

//define the Trie node here
struct Trie_Node {
    string word;//The word
    int count;  //The number of occurrences of a word
    Trie_Node *Next_Branch[MAXNUM];//Pointer to a 26-character node
    Trie_Node() : count(0)
    {
        word.empty();
        memset(Next_Branch, NULL, sizeof(Trie_Node*) * MAXNUM);
    }
    ~Trie_Node() {};
};

class Trie {
private:
    Trie_Node* ROOT;
private:
    void Reset(Trie_Node* Root);        //Reset The trie tree
    void Print(Trie_Node* Root);
public:
    void Insert(string str);            //Insert the string str
    bool Search(string str, int& cnt);  //Find the string str and return the number of occurrences
    bool Remove(string str);            //Delete the string str
    void PrintALL();                    //Prints all the nodes in the trie tree
    bool PrintPre(string str);          //Print a word prefixed with str
    Trie() {
        ROOT = new Trie_Node();         //Note that the root of the dictionary tree does not hold characters
    };
    ~Trie() {
        Reset(ROOT);
    };
};

#endif //_TRIE_

//Insert a word
void Trie::Insert(string str)
{
    if (str.empty()) return;
    Trie_Node *NODE = ROOT;
    int len = str.size();
    for (int i = 0;i < len;i++)
    {
        int index = str.at(i) - 'a';    //Case sensitive
        if (index < 0 || index > MAXNUM)//No insertion is performed
            return;
        if (NODE->Next_Branch[index] == NULL)            //The prefix of the word does not exist and is to be generated for that node
            NODE->Next_Branch[index] = new Trie_Node();
        NODE = NODE->Next_Branch[index];                 //Go to the next node
    }
    if (!NODE->word.empty())                         //The word has already appeared
    {
        NODE->count++;
        return;
    }
    else
    //The word did not appear, and we should insert it
    {
        NODE->count++;
        NODE->word = str;
    }
}

//Find a word, if it appeared, then return the number of occurrences of the word.
//If not, it will return false
bool Trie::Search(string str, int& cnt)
{
    assert(!str.empty());
    int index = INT_MIN;
    Trie_Node *NODE = ROOT;
    int length = str.size();
    int i = 0;
    while (NODE && i < length)
    {
        index =  str.at(i) - 'a';           //Case sensitive
        if (index < 0 || index > MAXNUM)  //No insertion is performed
            return false;
        NODE = NODE->Next_Branch[index];
        i++;
    }
    if (NODE && !NODE->word.empty())
    {
        cnt = NODE->count;
        return true;
    }
    return false;
}

bool Trie::Remove(string str)
{
    assert(!str.empty());
    int index = INT_MIN;
    Trie_Node *NODE = ROOT;
    int length = str.size();
    int i = 0;
    while (NODE && i < length)
    {
        index =  str.at(i) - 'a';           //Case sensitive
        if (index < 0 || index > MAXNUM)  //No deletion is performed
            return false;
        NODE = NODE->Next_Branch[index];
        i++;
    }
    if (NODE && !NODE->word.empty())
    {
        NODE->word.clear();
        return true;
    }
}

void Trie::PrintALL()
{
    Print(ROOT);
}

bool Trie::PrintPre(string str)
{
    assert(!str.empty());
    int index = INT_MIN;
    Trie_Node *NODE = ROOT;
    int length = str.size();
    int i = 0;
    while (NODE && i < length)
    {
        index =  str.at(i) - 'a';       //Case sensitive
        if (index < 0 || index > MAXNUM)
            return false;
        NODE = NODE->Next_Branch[index];
        i++;
    }
    if (NODE)   //We can find the word
    {
        Print(NODE);
        return true;
    }
    return false;
}

void Trie::Print(Trie_Node* Root)
{
    if (Root == NULL)
        return;
    //Print the word
    if (!Root->word.empty())
        cout << Root->word << " " << Root->count << endl;

    for (int i = 0;i < MAXNUM;i++)
        Print(Root->Next_Branch[i]);//Print all the children of the node
}

//Rest trie tree
void Trie::Reset(Trie_Node* Root)
{
    if (Root == NULL)
        return;
    for (int i = 0;i < MAXNUM;i++)
        Reset(Root->Next_Branch[i]);
    //Reset the word
    if (!Root->word.empty())
        Root->word.clear();
    delete Root;    //Delete the node
    Root = NULL;
}

int NUM_TO_INSERT, NUM_TO_SEARCH, NUM_TO_DELETE, NUM_TO_SBF;

//Main Function
int main(int argc, char **argv)
{
    ios::sync_with_stdio(false);
    Trie TREE;
    cout << "Input the number of words you want to insert:" << endl;
    cin >> NUM_TO_INSERT;

    for (int i = 0;i < NUM_TO_INSERT;i++)
    {
        string STRING;
        cin >> STRING;
        TREE.Insert(STRING);
    }

    cout << endl;
    cout << "Input the number of words you want to search:" << endl;
    cin >> NUM_TO_SEARCH;

    for (int i = 0;i < NUM_TO_SEARCH;i++)
    {
        string STRING;
        cin >> STRING;
        int count = -1;
        bool CanFind = TREE.Search(STRING, count);
        if (CanFind)
            cout << STRING << " exists, its number of occurrences is " << count << endl;
        else
            cout <<  STRING << " does not exists!" << endl;
    }
    cout << endl;
    cout << "Here are all the nodes in the Trie tree:" << endl;

    TREE.PrintALL();

    cout << endl;
    cout << "Input the number of words you want to delete:" << endl;
    cin >> NUM_TO_DELETE;
    for (int i = 0;i < NUM_TO_DELETE;i++)
    {
        string STRING;
        cin >> STRING;
        bool Is_Deleted = TREE.Remove(STRING);
        if (Is_Deleted)
            cout << STRING << " deleted!" << endl;
        else
            cout << "Failed to delete " << STRING << endl;
    }

    cout << endl;
    cout << "Input the number of words you want to search by prefix:" << endl;
    cin >> NUM_TO_SBF;
    for (int i = 0;i < NUM_TO_SBF;i++)
    {
        string STRING;
        cin >> STRING;
        bool STATUS = TREE.PrintPre(STRING);
        if (!STATUS)
            cout << "There aren't any words begin with " << STRING << " !";
        cout << endl;
    }
    cout << endl;
    return 0;
}
内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值