权重结构的加权排序算法

权重结构的加权排序算法

开始算法之前,首先介绍一下向量中的排序方式,这里使用的是STL中的std::sort排序方式,具体使用的代码如下:

//定义加权排序的结构
template<typename T>
struct _sortStru
{
    T _data1;
    T _data2;
    T _data3;
    T _data4;
    int nWeight[4];
    _sortStru()
    {
        memset(this, 0, sizeof(_sortStru));
    }
};

bool _sort_sample(const _sortStru<int> &l,  const _sortStru<int> &r)
{
    return l._data1 < r._data1;
}

int main()
{
    // 初始化一个vector,成员类型为_sortStru<int>
    vector< _sortStru<int> > vec;
    int i = 0;
    for (i = 0; i < MAXNUM; i++)
    {
        _sortStru<int> sort;
        sort._data1 = Random();
        sort._data2 = Random();
        sort._data3 = Random();
        sort._data4 = Random();
        vec.push_back(sort);
    }

    // 输出
    for (i = 0; i < MAXNUM; i++)
    {
        _sortStru<int> out;
        out = vec.at(i);
        cout<< out._data1<<" "<<out._data2<<" "<<out._data3<<" "<<out._data4<<" ";
        cout<<endl;
    }
    cout<<endl;

    // 简单排序,最结构体中的第一个成员进行排序
    std::sort(vec.begin(), vec.end(), _sort_sample);
    for (i = 0; i < MAXNUM; i++)
    {
        _sortStru<int> out;
        out = vec.at(i);
        cout<< out._data1<<" "<<out._data2<<" "<<out._data3<<" "<<out._data4<<" ";
        cout<<endl;
    }
    cout<<endl;
    return 0;
}

  正面代码段时对vec中的_sortStru<int>成员,按照结构体中第一个成员进行排序。

 下面给出的是对这个的加权排序

  每一个结构体的成员都有一个自己的权重,结构体的定义如下:

//定义加权排序的结构
template<typename T>
struct _sortStru
{
    T _data1;
    T _data2;
    T _data3;
    T _data4;
    int nWeight[4];
    _sortStru()
    {
        memset(this, 0, sizeof(_sortStru));
    }
};

  在这个结构中有四个成员变量,分别任_data1 - _data4,这个四个成员都有自己的权重,比如_data1的权重是30,_data2的权重是20,_data3的权重是40,_data4的权重是10。然后根据这些权重对一组数据进行排序。然后将排序后的结果从大到小排列出来。

  具体的排序方法是:

  首先,对这组数据中的每个成员从小到大排序,具体的先对第一个成员进行从小到大排序,排好序后给这些成员添加上自己的位置权重,最小的为0,然后依次增加,循环的给所有的成员都添加上位置权重。

  然后,对这些具有位置权重的数据进行加权排序。

  具体代码如下:

  1 #include <iostream>
  2 #include <vector>
  3 #include <assert.h>
  4 #include <algorithm>
  5 #define Random() (rand()%100)
  6 using namespace std;
  7 #define MAXNUM 10
  8
  9 //定义加权排序的结构
 10 template<typename T>
 11 struct _sortStru
 12 {
 13     T _data1;
 14     T _data2;
 15     T _data3;
 16     T _data4;
 17     int nWeight[4];
 18     _sortStru()
 19     {
 20         memset(this, 0, sizeof(_sortStru));
 21     }
 22 };
 23
 24
 25 bool _sort_sample(const _sortStru<int> &l,  const _sortStru<int> &r)
 26 {
 27     return l._data1 < r._data1;
 28 }
 29
 30
 31 class _sort
 32 {
 33 public:
 34     _sort() : pos(0){}
 35     _sort(int nPos) : pos(nPos){}
 36     bool operator()(const _sortStru<int> &l,  const _sortStru<int> &r)
 37     {
 38         switch (pos)
 39         {
 40         case 0:
 41             return l._data1 < r._data1;
 42         case 1:
 43             return l._data2 < r._data2;
 44         case 2:
 45             return l._data3 < r._data3;
 46         case 3:
 47             return l._data4 < r._data4;
 48         default:
 49             return l._data1 < r._data1;
 50         }
 51     }
 52
 53 private:
 54     int pos;
 55 };
 56
 57 template<class T>
 58 class Add_Weight
 59 {
 60 public:
 61     Add_Weight(int type, int start)
 62         : ntype(type), nstart(start), nLastValue(0), nLastWeight(0)
 63     {
 64     }
 65
 66     void operator()(_sortStru<T> &_F)
 67     {
 68         switch (ntype)
 69         {
 70         case 0: default:
 71             if (_F._data1 == nLastValue)
 72             {
 73                 _F.nWeight[ntype] = nLastWeight;
 74             }
 75             else
 76             {
 77                 _F.nWeight[ntype] = nstart;
 78                 nLastValue = _F._data1;
 79                 nLastWeight = nstart;
 80             }
 81             break;
 82         case 1:
 83             if (_F._data2 == nLastValue)
 84             {
 85                 _F.nWeight[ntype] = nLastWeight;
 86             }
 87             else
 88             {
 89                 _F.nWeight[ntype] = nstart;
 90                 nLastValue = _F._data2;
 91                 nLastWeight = nstart;
 92             }
 93             break;
 94         case 2:
 95             if (_F._data3 == nLastValue)
 96             {
 97                 _F.nWeight[ntype] = nLastWeight;
 98             }
 99             else
100             {
101                 _F.nWeight[ntype] = nstart;
102                 nLastValue = _F._data3;
103                 nLastWeight = nstart;
104             }
105             break;
106         case 3:
107             if (_F._data4 == nLastValue)
108             {
109                 _F.nWeight[ntype] = nLastWeight;
110             }
111             else
112             {
113                 _F.nWeight[ntype] = nstart;
114                 nLastValue = _F._data4;
115                 nLastWeight = nstart;
116             }
117             break;
118         }
119         nstart++;
120     }
121 private:
122     int ntype;
123     int nstart;
124     T nLastValue;
125     int nLastWeight;
126 };
127
128
129
130 // 四个参数的权重类
131 class CWeight
132 {
133 public:
134     CWeight()
135     {
136         weight_1 = 0;
137         weight_1 = 0;
138         weight_1 = 0;
139         weight_1 = 0;
140     };
141
142     CWeight(int Fir, int Sec, int thi, int Fou)
143         : weight_1(Fir), weight_2(Sec), weight_3(thi), weight_4(Fou)
144     {
145     };
146
147     void Check()
148     {
149         assert(weight_1 + weight_2 + weight_3 + weight_4 == 100);
150     }
151
152 public:
153     int weight_1;
154     int weight_2;
155     int weight_3;
156     int weight_4;
157 };
158
159 template<class T>
160 class Compare_Weight
161 {
162 public:
163     Compare_Weight(CWeight *pF)
164         : pweight(pF)
165     {
166     }
167
168     bool operator()(const _sortStru<T> &_F, const  _sortStru<T> &_L)
169     {
170         T t1 = _F.nWeight[0] * pweight->weight_1
171             + _F.nWeight[1] * pweight->weight_2
172             + _F.nWeight[2] * pweight->weight_3
173             + _F.nWeight[3] * pweight->weight_4;
174
175         T t2 = _L.nWeight[0] * pweight->weight_1
176             + _L.nWeight[1] * pweight->weight_2
177             + _L.nWeight[2] * pweight->weight_3
178             + _L.nWeight[3] * pweight->weight_4;
179
180         return t1 > t2;
181     }
182
183 private:
184     CWeight *pweight;
185 };
186
187 int main()
188 {
189     // 初始化一个vector,成员类型为_sortStru<int>
190     vector< _sortStru<int> > vec;
191     int i = 0;
192     for (i = 0; i < MAXNUM; i++)
193     {
194         _sortStru<int> sort;
195         sort._data1 = Random();
196         sort._data2 = Random();
197         sort._data3 = Random();
198         sort._data4 = Random();
199         vec.push_back(sort);
200     }
201
202     // 输出
203     for (i = 0; i < MAXNUM; i++)
204     {
205         _sortStru<int> out;
206         out = vec.at(i);
207         cout<< out._data1<<" "<<out._data2<<" "<<out._data3<<" "<<out._data4<<" ";
208         cout<<endl;
209     }
210     cout<<endl;
211
212     // 简单排序,最结构体中的第一个成员进行排序
213     std::sort(vec.begin(), vec.end(), _sort_sample);
214     for (i = 0; i < MAXNUM; i++)
215     {
216         _sortStru<int> out;
217         out = vec.at(i);
218         cout<< out._data1<<" "<<out._data2<<" "<<out._data3<<" "<<out._data4<<" ";
219         cout<<endl;
220     }
221     cout<<endl;
222
223     // 简单排序,最结构体中的第N个成员进行排序
224     std::sort(vec.begin(), vec.end(), _sort(2));
225     for (i = 0; i < MAXNUM; i++)
226     {
227         _sortStru<int> out;
228         out = vec.at(i);
229         cout<< out._data1<<" "<<out._data2<<" "<<out._data3<<" "<<out._data4<<" ";
230         cout<<endl;
231     }
232     cout<<endl;
233
234     // 加权排序
235     for (i = 0; i < 4; i++)
236     {
237         std::sort(vec.begin(), vec.end(), _sort(i));
238         std::for_each(vec.begin(), vec.end(), Add_Weight<int>(i, 0));
239     }
240     CWeight *weight = new CWeight(50, 50, 0, 0);
241     weight->Check();
242     std::sort(vec.begin(), vec.end(), Compare_Weight<int>(weight));
243     for (i = 0; i < MAXNUM; i++)
244     {
245         _sortStru<int> out;
246         out = vec.at(i);
247         cout<< out._data1<<" "<<out._data2<<" "<<out._data3<<" "<<out._data4<<" ";
248         cout<<endl;
249     }
250     cout<<endl;
251
252     return 0;
253 }
时间: 2024-11-13 06:39:14

权重结构的加权排序算法的相关文章

【Unity3D自学记录】可视化对照十多种排序算法(C#版)

在这篇文章中.我会向大家展示一些排序算法的可视化过程.我还写了一个工具.大家可对照查看某两种排序算法. 下载源代码 – 75.7 KB 下载演示样例 – 27.1 KB 引言 首先,我觉得是最重要的是要理解什么是"排序算法".依据维基百科.排序算法(Sorting algorithm)是一种能将一串数据按照特定排序方式进行排列的一种算法. 最经常使用到的排序方式是数值顺序以及字典顺序.有效的排序算法在一些算法(比如搜索算法与合并算法)中是重要的,如此这些算法才干得到正确解答.排序算法也

【排序】希尔排序算法

    特别说明: 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构.     希尔排序算法摘要: 希尔排序又称为“缩小增量排序”.直接插入排序算法在效率上虽说没办法突破 ,但其在少量数据或待排序列基本有序的情况下,效率却是非常高效的.因此,为进一步提高排序算法的效率,就需要适当地构造前述的那些条件.希尔排序就是第一批突破排序算法时间复杂度  的一个算法.因此,希尔排序算法算是一种属于插入排序类别的方法. 希尔排序算法思想: 算法总体描述

结构-行为-样式-Js排序算法之 直接插入排序

最新因工作原因需要接触到算法,之前学习C++的时候有接触过算法,Javascript中实现算法其实也是大同小异.下面我讲下第一个实现的排序算法--直接插入排序.基本实现思路:假定一个数组中前n(n>=2)个值已经排序好了,那我们就从第n+1个与前面进行比较,当  a[n+1] > a [i] && a[n+1] < a[i-1] 的时候则进行插入,以此类推. var arr = [23,85,61,37,55,12,63,12,99,39,70,21]; function

搜索引擎网页排序算法

2.1基于词频统计——词位置加权的搜索引擎 利用关键词在文档中出现的频率和位置排序是搜索引擎最早期排序的主要思想,其技术发展也最为成熟,是第一阶段搜索引擎的主要排序技术,应用非常广泛,至今仍是许多搜索引擎的核心排序技术.其基本原理是:关键词在文档中词频越高,出现的位置越重要,则被认为和检索词的相关性越好. 1)词频统计 文档的词频是指查询关键词在文档中出现的频率.查询关键词词频在文档中出现的频率越高,其相关度越大.但当关键词为常用词时,使其对相关性判断的意义非常小.TF/IDF很好的解决了这个问

加权随机算法

加权随机算法一般应用在以下场景:有一个集合S,里面比如有A,B,C,D这四项.这时我们想随机从中抽取一项,但是抽取的概率不同,比如我们希望抽到A的概率是50%,抽到B和C的概率是20%,D的概率是10%.一般来说,我们可以给各项附一个权重,抽取的概率正比于这个权重.那么上述集合就成了: {A:5,B:2,C:2,D:1} 方法一: 扩展这个集合,使每一项出现的次数与其权重正相关.在上述例子这个集合扩展成:{A,A,A,A,A,B,B,C,C,D}然后就可以用均匀随机算法来从中选取. 好处:选取的

拓扑排序算法

#include<stdio.h>#include<stdlib.h>#define MAXVEX 100 //最大顶点数typedef char VertexType; //顶点typedef int EdgeType; //权值#define UNVISITED -1 //标记未访问#define VISITED 1 //标记未访问#define OK 1#define ERROR 0typedef int Status; typedef struct EdgeNode{ in

python的random模块及加权随机算法的python实现

random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串. random.seed(x)改变随机数生成器的种子seed. 一般不必特别去设定seed,Python会自动选择seed. random.random()    用于生成一个随机浮点数n,0 <= n < 1 random.uniform(a,b)    用于生成一个指定范围内的随机浮点数,生成的随机整数a<=n<=b; random.randint(a,b)    用于生成一个指定范围内的整数,a为下限,

数据结构排序算法总结

在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的:若具有相同关键字的记录之间的相对次序发生改变,则称这种排序方法是不稳定的.即所有相等的数经过某种排序方法后,仍能保持它们在排序之前的相对次序,则说这种排序算法是稳定的,反之,就是不稳定的. 稳定的排序算法如下表所示: 稳定的排序 时间复杂度 空间复杂度 冒泡排序(bubble sort) 最差.平均都是O(n^2),最好是O(n) 1 插入排序(insertion sort

机器学习-加权采样算法简介

场景用户画像的构造中,想象一个场景:你经过辛辛苦苦抓数据,清洗数据,收集用户行为,目的就是给用户计算兴趣标签. 这时候你可能会遇到一个两难的问题:如果给用户计算出兴趣标签的权重了,那应该保留多少标签呢?保留太多的话,每次召回候选集时,计算复杂度可不低,只保留少部分吧,那真是手心手背都是肉,生怕丢弃的标签才是用户的真爱. 怎么办?这时候,你需要的一个简单的加权采样算法,每次召回时并不使用全部用户标签,而是按照权重采样一部分标签来使用,这样做的好处当然很明显: 大大减少召回时的计算复杂度:可以保留更