005 測驗 情景之男女相親演算法

2021-08-27 20:02:30 字數 3954 閱讀 9760

[img]

[b]# 005.測驗.情景之男女相親演算法[/b]

相親演算法,源於剩男剩女的相親,解決男女速配問題。

過程大概是:根據相親喜好,男女互相,按分值匹配。

@史榮久 / 2015-02-02 / cc-by-sa-3.0

[b]## 任務說明[/b]

事實上,愛美之心人皆有之,追求物質符合自然選擇。

現狀是,韓劇裡高富帥棒子稀缺,白富美洗白的居多。

現在,我們搞乙個相親演算法,讓高富帥和白富美速配。

有三對單身男女,姓名,特點和心中的ta的特點如下:

人及屬性 | 對ta的喜好及分值

1:高 富 | 富:10,白:20,美:30

2:白 富 | 富:10,高:20,帥:30

3:高 帥 | 富:30,白:10,美:20

4:白 美 | 富:30,高:10,帥:20

5:高富帥 | 富:10,白:30,美:20

6:白富美 | 富:10,高:30,帥:20

這樣,以男1號"高富"為例,他對女選手喜好如下:

女2號:白+富 = 20+10 = 30

女4號:白+美 = 20+30 = 50

女6號:白+富+美 = 10+20+30 = 60

演算法只對喜好值求和,對存在加,不存在的不加。

以此類推,為每個單身者計算出候選人列表。

男1:女2(30),女4(50),女6(60)

女2:男1(30),男3(50),男5(60)

男3:女2(40),女4(30),女6(60)

女4:男1(40),男3(30),男5(60)

男5:女2(40),女4(50),女6(60)

女6:男1(40),男3(50),男5(60)

可以看到,男5和女6最受歡迎,但這只是單方面的。

以女6為例,把男相女和女相男的分值求和,得總分。

女6+男1 = 40+60 = 100

女6+男3 = 50+60 = 110

女6+男5 = 60+60 = 120

這樣,女6和男5分值最高,匹配成功。以此類推。

最後,牽手情況:男5+女6,男1+女4,男3+女2

[b]## 資料儲存[/b]

以下幾張表,無事務,唯讀不寫,因此使用myisam表引擎。

create table if not exists `user` (

`uid` int not null comment '單身使用者id',

`gender` int not null comment '性別:0-女,1-男',

`name` varchar(45) not null comment '使用者姓名',

primary key (`uid`))

engine = myisam

default character set = utf8

collate = utf8_bin;

create table if not exists `label` (

`lid` int not null comment '標籤id',

`name` varchar(45) not null comment '標籤名字',

primary key (`lid`))

engine = myisam

default character set = utf8

collate = utf8_bin;

create table if not exists `user_label` (

`uid` int not null comment '使用者',

`lid` int not null comment '使用者的標籤',

primary key (`uid`, `lid`))

engine = myisam

default character set = utf8

collate = utf8_bin;

create table if not exists `user_love` (

`uid` int not null comment '使用者',

`lid` int not null comment '喜好的標籤',

`score` int null comment '喜好分值',

primary key (`uid`, `lid`))

engine = myisam

default character set = utf8

collate = utf8_bin;

-- 插入記錄

insert into `label` (`lid`, `name`) values

(0, '富'),(1, '高'),(2, '白'),(3, '帥'),(4, '美');

insert into `user` (`uid`, `gender`, `name`) values

(1, 1, '高富'),(3, 1, '高帥'),(5, 1, '高富帥'),

(2, 0, '白富'),(4, 0, '白美'),(6, 0, '白富美');

insert into `user_label` (`uid`, `lid`) values

(1, 0),(1, 1),

(2, 0),(2, 2),

(3, 1),(3, 3),

(4, 2),(4, 4),

(5, 0),(5, 1),(5, 3),

(6, 0),(6, 2),(6, 4);

insert into `user_love`(`uid`,`lid`,`score`) values

(1, 0, 10),(1, 2, 20),(1, 4, 30),

(2, 0, 10),(2, 1, 20),(2, 3, 30),

(3, 0, 30),(3, 2, 10),(3, 4, 20),

(4, 0, 30),(4, 1, 10),(4, 3, 20),

(5, 0, 10),(5, 2, 30),(5, 4, 20),

(6, 0, 10),(6, 1, 30),(6, 3, 20);

-- 檢查資料

select u.name,

group_concat(l.name order by l.lid)

from user_label as ul,user as u,label as l

where ul.uid = u.uid and ul.lid=l.lid

group by u.name order by u.uid;

select u.name,

group_concat(l.name,':',ul.score order by l.lid)

from user_love as ul,user as u,label as l

where ul.uid = u.uid and ul.lid=l.lid

group by u.name order by u.uid;

[b]## 問題來了[/b]

我們稱以上演算法為相親演算法(blindate),請盡情發揮。

(1)實現相親演算法,輸入男,輸出候選女的列表和分值。

即:輸入男(uid),得到候選女的列表(uid,score)

(2)使用者量增到男女各5萬,人均標籤從3個增到10個。

要重構程式實現,要求候選女的列表按喜比例分配。

例如:男1的喜好值仍為:富:10,白:20,美:30,

則輸出列表中,富佔1/6,白佔2/6,美占3/6。

列表需要去重(distinct),數量不足時需要補充。

優先滿足每使用者輸出100個候選,然後考慮比例。

(3)假設,相親演算法在10萬男x10萬女時,有效能瓶頸。

請談談改善方法和依據。

----

題圖:《非誠勿擾》是一檔男女速配的相親節目,很多人疑其真假,評其美醜,但這些真的那麼重要麼?

原文:[url]

003 測驗 SQL之債權統計

這是乙個比較貼近實際業務的sql練習,技術點比較常用和實用。如下圖,業務中,存在以下資料和資料關係 乙個顧客 cust 會有零或多個債權 loan 債權會有零或多個交易 transaction loan表balance為餘額,repayday為下次還款日,transaction表中,id是自增的,a...

Binder機制情景分析之linux環境適配

執行環境 linux4.1.15 開發板為天嵌imx6ul make menuconfig轉到device drivers android,選中andoid drivers和android binder ipc driver示例如下 轉到device drivers staging drivers ...

006 內測 情景之迷你財務記賬

題圖 晉商票號賬本。晉商票號,縱橫明清500年的 華爾街 跨國的金融大鱷,創下諸多輝煌。迷你版的財務記賬,包括了餘額,交易和明細三塊。能夠滿足基本的記賬要求 對賬,紅訂正,做報表。史榮久 2015 03 01 cc by sa 3.0 使用者1 u1 餘額0元,使用者1有三件物品 物品1,10元 物...